Perl:sort<=&燃气轮机;不起作用

Perl:sort<=&燃气轮机;不起作用,perl,sorting,numeric,Perl,Sorting,Numeric,我不知道为什么Perl排序不起作用。 请建议如何解决此问题 while (<>) { chomp; if (/VIOLATE/) { @lines = split " ", $_; #print "$lines[-2]\n"; ## Print last but one column my @viol = "$lines[-2]\n"; @sorted = sort {$a <=> $

我不知道为什么Perl排序不起作用。 请建议如何解决此问题

while (<>) {

    chomp;
    if (/VIOLATE/) {

        @lines = split " ", $_;
        #print "$lines[-2]\n";  ## Print last but one column
        my @viol = "$lines[-2]\n";

        @sorted = sort {$a <=> $b} @viol;
        print "@sorted";
    }
};

您是否试图匹配其中包含
违规
的任何行,将结果放入数组中,然后对所有违规进行排序?如果是这样,您需要在循环之外声明和排序
@viol

use strict;
use warnings; # Don't forget these!

my @viol;

while (<>) {
    chomp;
    if (/VIOLATE/) {
        my @lines = split(/\s+/); # Split on one or more whitespace characters.
        push @viol, $lines[-2];
    }
}

# sort and print
my @sorted = sort {$a <=> $b} @viol;
print "@sorted";
使用严格;
使用警告;#别忘了这些!
我的小提琴;
而(){
咀嚼;
如果(/increal/){
my@lines=split(/\s+/);#在一个或多个空白字符上拆分。
推送@viol$行[-2];
}
}
#分类和打印
my@sorted=sort{$a$b}@viol;
打印“@sorted”;

这将输出:
-11.06-2.06-1.106-1.06-0.226

您的排序工作正常。唯一的问题是数组只有一个元素。在排序的正上方,您执行分配

如果您想让它工作,您需要在排序之前填充数组

这也是一条单线:

perl -lanwe 'push(@a, $F[-2]) if /VIOLATE/ }{ print for sort { $a <=> $b } @a' 

与其使用爱斯基摩人的接吻技巧,不如让IMO读者更好地阅读你的文章:`……违反/;结束{print for sort{$a$b}@a}@jrguson这不是一个技巧,它只是碰巧与开关附加的代码相匹配。不过,我明白你的观点可能值得一提。我知道它结束了由
-p
-n
创建的循环,但我需要这一解释。@jrfuson解释补充道。但是不,它实际上不适用于
-p
,因为它会变成
,而(){…}{…}继续{print$}
。它基本上将
-p
转换为
-n
,最后只打印一次。
perl -lanwe 'push(@a, $F[-2]) if /VIOLATE/ }{ print for sort { $a <=> $b } @a' 
perl -MO=Deparse -lanwe 'push(@a, $F[-2]) if /VIOLATE/ }{ print for sort { $a <=> $b } @a'
BEGIN { $^W = 1; }                     # warnings enabled by -w
BEGIN { $/ = "\n"; $\ = "\n"; }        # line endings enabled by -l
LINE: while (defined($_ = <ARGV>)) {   # while(<>) loop added by -n
    chomp $_;                          # chomp added by -l
    our(@F) = split(' ', $_, 0);       # autosplit enabled by -a
    push @a, $F[-2] if /VIOLATE/;      # our code
}                                      # eskimo kiss close
{                                      # eskimo kiss open
    print $_ foreach (sort {$a <=> $b} @a);   # our END code
}                                      # closing bracket added by -n
-e syntax OK