打开目录并在文件中搜索模式

技术员

我的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),而不是路径(不dir1/dir2/path.txt)。

因此,当程序尝试打开$item†时,结果表明没有这种东西需要打开"$dir/$item"或者,将其放在文件列表中的每个条目之前,然后使用正确的路径

use warnings;
use strict;

my $dir = 'dir1/dir2';

opendir (my $dh, $dir) or die $!;
my @entries = map { "$dir/$_" } readdir $dh;
closedir $dh;

foreach my $item (@entries) {
    next if not -f $item;
    open(my $fh, "<", $item) or die "Can't open < $item: $!";

    while(my $line = <$fh>) {
        print $line if $line =~ /pattern/;
    }
    close $fh;
}

请注意,我跳过了不是常规文件的条目(not -f请参阅filetest运算符),并使用词法文件句柄代替typeglobsmy $fh代替FILE)。

获取条目列表的另一个选项是glob(请参阅File :: Glob),它确实返回路径:

my @entries = glob $dir;  # dir1/dir2/file.txt  (etc)

但是,如果确实要提前获取整个文件列表,而不是一次读取和处理一个项目,那么您最好立即根据需要对其进行过滤,因此

my @files = grep { -f } glob $dir;

现在您只有常规文件。

当然,也可以在上面的程序中过滤整个列表。map本身就能做到

opendir (my $dh, $dir) or die $!;
my @files = map { -f "$dir/$_" ? "$dir/$_" : () } readdir $dh;
closedir $dh;

这里map也有一些过滤器的作用:一个空列表()(当条目不是纯文件时返回)在返回列表中变平从而有效消失,因此在这种情况下等于不返回任何内容。或者,连锁grepmap像往常一样

my @files = grep { -f } map { "$dir/$_" } readdir $dh;

这的确使列表再次获得通过,但这是经过优化的,几乎不需要担心(除非我们有巨大的文件列表-它本身就带来了问题-并且经常这样做)。


我还想提到,为此也有很好的模块。

Path :: Tiny的示例

use Path::Tiny;

my $it = path($dir)->iterator;

while (my $entry = $it->()) { 
    # it omits . and ..
}

这是一个“惰性”迭代器。有关此模块提供的许多其他功能,请参见文档,以及更多信息。


而不是file.txt

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

打开文件中的每个路径并在每个文件中搜索模式

来自分类Dev

如何通过名称模式搜索文件并在其目录中执行命令?

来自分类Dev

通过名称搜索文件并在vim中打开文件的别名

来自分类Dev

如何打开与子目录中的模式匹配的文件

来自分类Dev

Excel VBA:按模式在子目录中打开文件

来自分类Dev

如何打开与子目录中的模式匹配的文件

来自分类Dev

使用多种搜索模式获取目录中的文件

来自分类Dev

在目录中搜索文件

来自分类Dev

如何从文件中获取模式并在UNIX中搜索另一个文件

来自分类Dev

打开目录并在后台工作程序查询中处理文件/文件夹

来自分类Dev

根据模式将文件拆分为多个文件,并在Unix中通过搜索模式命名新文件?

来自分类Dev

搜索并匹配前 6 个字符的 pdf 文件并在 Windows 默认程序中打开它

来自分类Dev

递归搜索并在每个目录中打印最新的tar.gz文件

来自分类Dev

如何从目录中打开文件?

来自分类Dev

在目录中搜索整个文件

来自分类Dev

在目录结构中搜索文件

来自分类Dev

搜索csv文件中的模式

来自分类Dev

ls:在通配符搜索中不显示匹配相同模式的目录,仅显示文件

来自分类Dev

仅在目录的指定文件名中递归搜索模式/文本?

来自分类Dev

打开文本文件并在OS X上搜索

来自分类Dev

打开文本文件并在OS X上搜索

来自分类Dev

我可以从文件A打开模式窗口并在模式窗口上显示文件B吗?

来自分类Dev

递归遍历目录,并在目录中的文件上运行命令

来自分类Dev

无法从python目录中打开文件

来自分类Dev

无法在资源目录中打开文件

来自分类Dev

在目录中打开文件夹

来自分类Dev

按特定顺序从目录中打开文件

来自分类Dev

如何打开github目录中的.cpp文件?

来自分类Dev

在目录中打开文件夹

Related 相关文章

  1. 1

    打开文件中的每个路径并在每个文件中搜索模式

  2. 2

    如何通过名称模式搜索文件并在其目录中执行命令?

  3. 3

    通过名称搜索文件并在vim中打开文件的别名

  4. 4

    如何打开与子目录中的模式匹配的文件

  5. 5

    Excel VBA:按模式在子目录中打开文件

  6. 6

    如何打开与子目录中的模式匹配的文件

  7. 7

    使用多种搜索模式获取目录中的文件

  8. 8

    在目录中搜索文件

  9. 9

    如何从文件中获取模式并在UNIX中搜索另一个文件

  10. 10

    打开目录并在后台工作程序查询中处理文件/文件夹

  11. 11

    根据模式将文件拆分为多个文件,并在Unix中通过搜索模式命名新文件?

  12. 12

    搜索并匹配前 6 个字符的 pdf 文件并在 Windows 默认程序中打开它

  13. 13

    递归搜索并在每个目录中打印最新的tar.gz文件

  14. 14

    如何从目录中打开文件?

  15. 15

    在目录中搜索整个文件

  16. 16

    在目录结构中搜索文件

  17. 17

    搜索csv文件中的模式

  18. 18

    ls:在通配符搜索中不显示匹配相同模式的目录,仅显示文件

  19. 19

    仅在目录的指定文件名中递归搜索模式/文本?

  20. 20

    打开文本文件并在OS X上搜索

  21. 21

    打开文本文件并在OS X上搜索

  22. 22

    我可以从文件A打开模式窗口并在模式窗口上显示文件B吗?

  23. 23

    递归遍历目录,并在目录中的文件上运行命令

  24. 24

    无法从python目录中打开文件

  25. 25

    无法在资源目录中打开文件

  26. 26

    在目录中打开文件夹

  27. 27

    按特定顺序从目录中打开文件

  28. 28

    如何打开github目录中的.cpp文件?

  29. 29

    在目录中打开文件夹

热门标签

归档