我的问题可能很简单,但我是一个完整的新手.我想搜索特定短语的多个文本文件的内容,然后在屏幕上显示查找的行.我已经学会了如何处理单个文件.例如,如果我想搜索一个单词,请在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)
扩展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::Grep或App::Ack针对此特定问题:)
| 归档时间: |
|
| 查看次数: |
30088 次 |
| 最近记录: |