我需要测试一个文件,每行具有相同的列数,每个条目都是一些值,我只想选择每个值大于0.5的那些行。
我知道我可以通过这样的方式遍历每行中的数组:
open (IN, shift @ARGV);
while (<IN>){
chomp;
my $count = 0;
my @array = split/\t/;
foreach (@array){
if ($_ > 0.5) {
$count ++;
}
}
if ($count == scalar @array){
print $_,"\n";
}
}
close IN;
这有点长,我想知道是否有更好的方法吗?
感谢。
答案 0 :(得分:6)
使用List::Util
中的all
- 它会检查传递的代码块(通常是条件)是否对列表的所有元素都返回true。
use List::Util qw(all);
if (all { $_ > 0.5 } @array) {
print "Pass!"
}
它甚至会为你短路,一发现第一个假值就会终止,产生最快速的效果。
答案 1 :(得分:1)
my @array = 10 .. 20;
# compare size of array with list size of grep
if (@array == grep { $_ > 0.5 } @array) {
print "All are greater than 0.5\n";
}