使用Shell脚本菜单用Perl对文件进行排序

问题描述:

我有一个文件数量为10个随机单词。我能够让我的Perl脚本排序文件,但我不知道为什么,因为它排序和覆盖主文件。 例如file.txt有:“a,c,d,b”我把它读入文件名然后把它排序到另一个文件名sorted.txt“a,b,c,d”但是我不想让我的file.txt原始文件进行更改。使用Shell脚本菜单用Perl对文件进行排序

这是调用我的壳菜单perl的排序功能:

if [ "$choice" = 2 ] 
    then 
     perl perlsort.pl "$filename" 
     cp $filename $outputfilename 
fi 

这是我的Perl代码:

my $filename = shift @ARGV; 
open(FH,$filename) or die "$!"; 
my @lines = <FH>; 
close(FH); 

$, = "\n"; 

open(my $output, ">", "$filename") or die "Unable to open $filename: $!\n"; 
print $output sort map { chomp; $_ } @lines; 
close $output; 

如果你不想Perl来覆盖你的文件,不要”告诉它这样做:

open(my $output, ">", "$filename")打开$ filename写入,即覆盖它。

也许为输出指定不同的文件名,或使用File::Temp

顺便说一句,这是没有意义的包$文件名进入在Perl双引号,你可以直接

open my $output, '>', $filename or die ... 

此外,而不是通过线咬食线,你可以

chomp $lines; 
+0

正如你可以告诉我是Perl新手:) 我应该如何使用File :: Temp? – Nagne

+0

我讨厌阅读手册页,但您始终可以通过在终端中输入以下内容来查找File :: Temp的文档:perldoc File :: Temp – xyz123

你已经将已排序的内容写入您的Perl代码中的文件。尝试将open(my $output, ">", "$filename")中的“$ filename”替换为新文件名,以便脚本将写入新文件而不是重写输入文件。因此,不要忘记从bash脚本中删除cp $filename $outputfilename,否则它将用旧(输入)文件的内容替换新文件。或者(如果$outputfilename与perl脚本中的新文件名不同),它将创建一个新的未分类文件,其中包含$outputfilename名称和未分类内容,以3个文件结尾:2个包含未分类内容,1个 - 已分类。