如何在Perl中搜索多个文件中的字符串?

Mik*_*ke 11 perl

我的问题可能很简单,但我是一个完整的新手.我想搜索特定短语的多个文本文件的内容,然后在屏幕上显示查找的行.我已经学会了如何处理单个文件.例如,如果我想搜索一个单词,请在F的根目录中名为"wyvern.txt"的文本文件中说"Okay".以下代码有效:

#!/usr/bin/perl

$file = 'F:\wyvern.txt';
open(txt, $file);
while($line = <txt>) {
  print "$line" if $line =~ /Okay/;
}
close(txt);
Run Code Online (Sandbox Code Playgroud)

但是,如果我想在两个文本文件中搜索相同的短语,分别说"wyvern"和"casanova",或者如何在F的根目录中的"novels"目录中查找所有文件,该怎么办?

任何帮助将不胜感激.提前致谢

麦克风

编辑:

哈哈,我终于想出了如何搜索目录中的所有文件以进行模式匹配:)以下代码效果很好:

#!/usr/bin/perl  
@files = <F:/novels/*>;
foreach $file (@files) {
open   (FILE, "$file");
while($line= <FILE> ){
print "$line" if $line =~ /Okay/;
}
close FILE; 
} 
Run Code Online (Sandbox Code Playgroud)

hob*_*bbs 8

扩展Jonathan Leffler提供的好答案:

找到匹配项的文件名是$ARGV,并且只需稍作更改即可找到行号$..例:

while (<>) {
  print "$ARGV:$.:$_" if /pattern/;
} continue {
  close ARGV if eof; # Reset $. at the end of each file.
}
Run Code Online (Sandbox Code Playgroud)

此外,如果您有一个文件名列表并且它们不在命令行上,您仍然可以获得魔术ARGV行为.看:

{
  local @ARGV = ('one.txt', 'two.txt');
  while (<>) {
    print "$ARGV:$.:$_" if /Okay/;
  } continue {
    close ARGV if eof;
  }
}
Run Code Online (Sandbox Code Playgroud)

这对于对一系列文件进行逐行处理是一种非常有用的模式,无论它是什么 - 即使我可能会推荐File::GrepApp::Ack针对此特定问题:)