使用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;
答
你已经将已排序的内容写入您的Perl代码中的文件。尝试将open(my $output, ">", "$filename")
中的“$ filename”替换为新文件名,以便脚本将写入新文件而不是重写输入文件。因此,不要忘记从bash脚本中删除cp $filename $outputfilename
,否则它将用旧(输入)文件的内容替换新文件。或者(如果$outputfilename
与perl脚本中的新文件名不同),它将创建一个新的未分类文件,其中包含$outputfilename
名称和未分类内容,以3个文件结尾:2个包含未分类内容,1个 - 已分类。
正如你可以告诉我是Perl新手:) 我应该如何使用File :: Temp? – Nagne
我讨厌阅读手册页,但您始终可以通过在终端中输入以下内容来查找File :: Temp的文档:perldoc File :: Temp – xyz123