关于在Perl

时间:2017-03-22 04:03:38

标签: perl search find

我有一个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作为扩展名。谢谢你帮我找到了。

2 个答案:

答案 0 :(得分:1)

通过进行一些更改,我可以使用您粘贴的代码获得所需的输出:

use strict;
use warnings;

您应该始终使用它们,因为它们会通知您可能无法掌握的代码中的各种错误。

接下来我换了一行:

my $dir = './home/jdoe'; ##'./admin/programs'

。表示当前目录。此外,如果您遇到问题仍然尝试使用绝对路径(来自源)而不是相对路径。如果这可以解决您的问题,请告诉我。

答案 1 :(得分:1)

此脚本运行正常,没有任何问题。这个剧本隐藏的一件事就是模式。您可以共享该模式,让我们知道您对该模式的期望,以便我们可以验证。

您也可以在调试模式下运行程序,即

  

perl -d your_program。

这应该会带你进入调试模式,并且有很多选项可用于检查流程。输入&#39; n&#39;在调试提示符上插入代码流以了解代码如何流动。打字&#39; n&#39;将打印代码执行点及其结果