我正在编写一个perl程序,该文件根据文件的长度对文件中的行进行排序,等长的行应按字母顺序排序。
以下是我尝试过的内容。我不确定长度$ a和长度$ b以及cmp函数的使用。我的代码也没有编译,有人可以帮我这个忙。我对perl还是很陌生,所以请稍作解释会有所帮助!谢谢!
#!/usr/bin/perl -w
if (@ARGV != 1){
die "Usage $0: <file>\n";
}else {
foreach $file(@ARGV){
open my $f, '>', $file or die "Cannot open $file: $!\n";
my @lines = <$f>;
close $f;
foreach $line(@lines){
if (length $a == length $b){
@length_line = sort(length $a cmp length $b);
} else {
@length_line = sort(length $a <=> length $b);
}
}
}
print "@length_line\n";
}
答案 0 :(得分:3)
@length_line = sort(length $a cmp length $b);
可能不是您想要的-cmp运算符不应在长度函数的输出上使用-它应在字符串的实际值上使用
我认为您可以按
的顺序设置单个复合排序例程@sorted_lines = sort {((length $a) <=> (length $b)) || ($a cmp $b)} @lines;
然后,跳过整个循环-不必要。 以
结尾print "$_\n" foreach @sorted_lines;
答案 1 :(得分:0)
其他一些评论:
print "@length_line\n";
即使此数组具有所需的内容,也不能只在Perl中打印数组。要进行调试,请在Data :: Dumper程序包上进行阅读,以便可以做类似的事情
print Dumper(@length_line)。 “ \ n”;
对于读取文件的方法,您遇到了一些问题。认为您的“>”表示您要写入文件,这似乎不正确。您可以使用自己的阅读机制,也可以通过研究File :: Slurp包来这样做,因此您可以像这样阅读@lines:
我的@lines = read_file $ file,{slurp => 1};
为使自己写出出色的Perl,您可能希望打开严格模式和警告。当我看到您的foreach语句时想到了这一点,这些语句中实际上应该有一个my,例如:
foreach我的$ line(@lines)