Perl:sort<=&燃气轮机;不起作用
我不知道为什么Perl排序不起作用。 请建议如何解决此问题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 <=> $
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