【问题标题】:About searching recursively in Perl关于在 Perl 中递归搜索
【发布时间】: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 在数组上下文中返回更多。

标签: perl search find


【解决方案1】:

我能够使用您粘贴的代码获得所需的输出,只需进行一些更改,例如:

use strict;
use warnings;

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

接下来我换行了:

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

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

【讨论】:

    【解决方案2】:

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

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

    perl -d 你的程序。

    这应该带您进入调试模式,并且有很多选项可用于检查流程。在调试提示符上键入“n”以进入代码流以了解您的代码是如何流动的。输入“n”将打印代码执行点及其结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多