【发布时间】:2019-11-20 07:13:13
【问题描述】:
我的 Perl 脚本应该打开目录中的所有文件并在其中搜索模式并打印包含该模式的整行。 下面是代码。代码无法打开文件。
my $dir = 'dir1/dir2';
opendir (DIR, $dir) or die $!;
my @dir = readdir DIR;
foreach my $item (@dir) {
open(FILE, "<", "file.txt")
or die "Can't open < file.txt: $!";
while($line= <FILE>) {
print "$line" if $line=~ /pattern/;
}
close FILE;
}
closedir DIR;
请提出一些使它起作用的方法。
【问题讨论】:
-
readdir 只返回名称,而不是路径。因此,当您尝试打开
file.txt时,没有这样的事情——您需要说"$dir/file.txt"。另一种方法是将其添加到整个列表中,因此my @dir = map { "$dir/$_" } readdir DIR;和现在@dir中的文件具有正确的路径 -
嗯,如果按照您的逻辑,您尝试读取每个目录中的 file.txt - 但不是目录中的每个文件(-ies)。您的描述与您的代码逻辑不匹配。
-
我不确定 perl 脚本是否是解决您的任务的强制性要求。否则,您可以使用 find 和 grep 来获得相同的结果
find /some/dir -exec grep [pattern] {} \; -ls。此命令将搜索目录和子目录中的每个文件。 -
@PolarBear 也可以这样做,但是没有必要
find因为grep可以指定要搜索的内容,这里很简单,grep [options] PATTERN dir1/dir2/*其中options会决定如何呈现调查结果 -
请注意:并非所有版本的 grep 都支持在子目录中进行递归搜索 - find/grep 工作了很长时间并且从未失败过。