【发布时间】:2017-03-22 04:03:37
【问题描述】:
我有一个 Perl 脚本,我主要是根据这个网站上的问题拼凑而成的。我已经阅读了某些部分的文档以更好地理解它。无论如何,这里是:
#!/usr/bin/perl
use File::Find;
my $dir = '/home/jdoe';
my $string = "hard-coded pattern to match";
find(\&printFile, $dir);
sub printFile
{
my $element = $_;
if(-f $element && $element =~ /\.txt$/)
{
open my $in, "<", $element or die $!;
while(<$in>)
{
if (/\Q$string\E/)
{
print "$File::Find::name\n";
last; # stops looking after match is found
}
}
}
}
这是一个简单的脚本,类似于 grep,它将通过目录递归查找匹配的字符串。然后它将打印包含该字符串的文件的位置。它有效,但前提是文件位于我的主目录中。如果我更改硬编码搜索以查看不同的目录(我有权限),例如/admin/programs,脚本似乎不再做任何事情:没有输出显示,即使我知道它应该匹配至少一个文件(通过使用硬编码模式在admin/programs 中创建一个文件进行测试。为什么我会遇到这种行为?
另外,不妨否认这不是一个真正有用的脚本(哎呀,使用 grep 或 awk 会很容易!),但现在了解如何在 Perl 中执行此操作对我来说很重要。谢谢
编辑:发现问题。一个简单的疏忽是我正在寻找的目录中的文件没有 .txt 作为扩展名。感谢您帮助我找到它。
【问题讨论】:
-
这对我有用。 (这可能意味着首先检查每个小细节。)另外,您可能想尝试File::Find::Rule
-
你试过调试它吗?我首先添加一个
else,其中包含您使用的所有变量的打印。也许在你的家中创建一个测试子目录(并将$dir设置为它),其中包含一些目录和文件,以检查是否有关于/admin的内容(并且需要阅读的输出更少)。 -
哇。我觉得自己像个傻瓜。我不知道我以前怎么没有看到它,但是“检查每一个小细节”确实向我揭示了
/admin/programs中的所有文件都不以.txt结尾。我的条件是我的问题。现在可以了。我应该在这里回答我自己的问题,还是应该直接编辑它以说明问题所在? -
好的,很好 :) 它发生了。为此,我只想在最后添加一个(突出的)注释。这是一个简单的陈述,可能无法保证答案。
-
例如,
$id = (stat $file)[4]; $name = getpwuid($id)。 (可以写在一个语句中。)请参阅文档并搜索 SO。请注意,getpwuid在数组上下文中返回更多。