我有一个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作为扩展名。谢谢你帮我找到了。
答案 0 :(得分:1)
通过进行一些更改,我可以使用您粘贴的代码获得所需的输出:
use strict;
use warnings;
您应该始终使用它们,因为它们会通知您可能无法掌握的代码中的各种错误。
接下来我换了一行:
my $dir = './home/jdoe'; ##'./admin/programs'
。表示当前目录。此外,如果您遇到问题仍然尝试使用绝对路径(来自源)而不是相对路径。如果这可以解决您的问题,请告诉我。
答案 1 :(得分:1)
此脚本运行正常,没有任何问题。这个剧本隐藏的一件事就是模式。您可以共享该模式,让我们知道您对该模式的期望,以便我们可以验证。
您也可以在调试模式下运行程序,即
perl -d your_program。
这应该会带你进入调试模式,并且有很多选项可用于检查流程。输入&#39; n&#39;在调试提示符上插入代码流以了解代码如何流动。打字&#39; n&#39;将打印代码执行点及其结果