我正在读取一个文件并将数据存储在名为@lines的数组中.然后,我使用for循环遍历这个数组,并且在我匹配某个值的循环内:
$find = "fever"; if ($_ =~ /$find/) { print "$_\n"; $number++; #@lines = #print ("there are : " . $number); }
目前,我正在使用一个带有发热值的标量$find,而不是为每个过滤器执行重复的语句.
我可以传递一个数组进行比较,而不是一个标量关键字?
解决方法
如果您将文件读入列表,它将一次性完成所有操作
@array = <$fh>; # Reads all lines into array
将其与读取到标量上下文中进行对比
$singleLine = <$fh>; # Reads just one line
一次读取整个文件可能是一个问题,但是你会得到这个想法.
然后你可以使用grep过滤你的数组.
@filteredArray = grep /fever/,@array;
然后,您可以使用标量获取已过滤行的计数,这会对数组的解释强制标量(即单值)上下文,在这种情况下返回计数.
print scalar @filteredArray;
把它放在一起…
C:\temp>cat test.pl use strict; use warnings; # always my @a=<DATA>; # Read all lines from __DATA__ my @f = grep /fever/,@a; # Get just the fevered lines print "Filtered lines = ",scalar @f; # Print how many filtered lines we got __DATA__ abc fevered frier forever 111fever111 abc C:\temp>test.pl Filtered lines = 2 C:\temp>