在一个目录中有多个文件。从所有的文件中,我必须找到一个字符串的最后一次出现,并将该行打印到一个result.txt文件中。让我们假设这些文件类似于demo*. txt。
而我要找的字符串是“FREQ”,我试过的代码如下:
for ( glob("demo*.txt" ) ) {
my $xm = $_;
open my $fh, '<', $xm;
my $pat = "FREQ" ;
while(my $asa = <$fh>) {
my @last = grep(/FREQ/, $asa);
}
}
print " grep : @last\n";
我试过这个代码,但这给不了什么,我不能找到我正在犯的错误。
2条答案
按热度按时间qnyhuwrf1#
正如@vkk05所建议的,您需要将
use strict
和use warnings
添加到代码中当我跑的时候
问题出在
my @last
行。您在while
循环的作用域中定义了@last
。这意味着一旦while
循环退出,变量@last
就会被删除。将
@last
的定义移到while
作用域之外,并将print
行移到while
循环之后立即运行,将生成以下代码并且假设测试文件
use warnings
运行该脚本将提供
最后,在此上下文中使用
grep
是令人困惑的--它应该在迭代值列表时使用,而不是像本例中那样迭代单个条目。虽然代码可以很好地与您使用grep
的方式配合,但是使用grep
的更符合perl习惯的解决方案应该是注意事项
1.这里在适当的列表上下文中使用
grep
,与<$fh>
沿着遍历文件并匹配包含存储在$pat
中的模式的所有行1.结果存储在
@matches
中,因此为了获取最后一个结果,print
语句使用$matches[-1]
为@matches
中的最后一个条目建立索引。kmbjn2e32#
如果这是一个一次性的任务,我会使用一个简单的一行程序。
创建四个测试文件。最后一个为空:
运行:
输出: