Perl:按长度顺序打印文件的行,等长的行应按字母顺序排序

时间:2019-07-14 02:17:28

标签: perl

我正在编写一个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";
}

2 个答案:

答案 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";
  1. 即使此数组具有所需的内容,也不能只在Perl中打印数组。要进行调试,请在Data :: Dumper程序包上进行阅读,以便可以做类似的事情

    print Dumper(@length_line)。 “ \ n”;

  2. 对于读取文件的方法,您遇到了一些问题。认为您的“>”表示您要写入文件,这似乎不正确。您可以使用自己的阅读机制,也可以通过研究File :: Slurp包来这样做,因此您可以像这样阅读@lines:

    我的@lines = read_file $ file,{slurp => 1};

  3. 为使自己写出出色的Perl,您可能希望打开严格模式和警告。当我看到您的foreach语句时想到了这一点,这些语句中实际上应该有一个my,例如:

    foreach我的$ line(@lines)