如何循环遍历 Perl 目录中的文件? [复制]

Posted

技术标签:

【中文标题】如何循环遍历 Perl 目录中的文件? [复制]【英文标题】:How can I loop through files in a directory in Perl? [duplicate] 【发布时间】:2011-01-10 02:23:05 【问题描述】:

可能重复:How can I list all of the files in a directory with Perl?

我想遍历几百个文件,这些文件都包含在同一个目录中。我将如何在 Perl 中执行此操作?

【问题讨论】:

这个问题不是和这个问题重复的吗? ***.com/questions/1045792/… @Leonardo Herrera 确实如此。抱歉,我不记得那个了。投票结束。 我看不出这是怎么复制的。该问题询问如何遍历目录中的文件。标记的“重复”询问如何列出目录中的所有文件。明显不同。为什么要标记为重复? 【参考方案1】:
#!/usr/bin/perl -w

my @files = <*>;
foreach my $file (@files) 
  print $file . "\n";

在哪里

 @files = <*>;

可以

 @files = </var/www/htdocs/*>;
 @files = </var/www/htdocs/*.html>;

等等

【讨论】:

这不会列出 GNU/Linux 和可能其他类似操作系统上的隐藏文件(以点开头的文件)。【参考方案2】:

享受吧。

opendir(DH, "directory");
my @files = readdir(DH);
closedir(DH);

foreach my $file (@files)

    # skip . and ..
    next if($file =~ /^\.$/);
    next if($file =~ /^\.\.$/);

    # $file is the file used on this iteration of the loop

【讨论】:

谢谢!不过,我会使用next if ($file =~ /^.+$/);,以避免第二条语句;)。 @ashraf 正则表达式必须是 /^\.+$/ 而不是 /^.+$/ @Rauf 是的,我认为你是对的! :)【参考方案3】:

您可以使用readdir 或glob。

或者,您可以使用Path::Class等模块:

通常children() 将不包括自我和父条目。和..(或它们在非 Unix 系统上的等价物),因为这就像我是我自己的祖父企业。如果您确实需要所有目录条目,包括这些特殊条目,请为 all 参数传递一个 true 值:

@c = $dir->children(); # Just the children
@c = $dir->children(all => 1); # All entries

此外,还有一个 no_hidden 参数将排除所有通常“隐藏”的条目 - 在 Unix 上,这意味着排除所有以点开头的条目 (.):

@c = $dir->children(no_hidden => 1); # Just normally-visible entries

或者,Path::Tiny:

@paths = path("/tmp")->children;
@paths = path("/tmp")->children( qr/\.txt$/ );

返回目录中所有文件和目录的Path::Tiny 对象列表。自动排除 "."".."

如果提供了可选的qr// 参数,它只返回与给定正则表达式匹配的子名称的对象。仅使用基本名称进行匹配:

@paths = path("/tmp")->children( qr/^foo/ );
# matches children like the glob foo*

将目录条目列表放入一个数组会浪费一些内存(与一次只获得一个文件名相反),但只有几百个文件,这不太可能成为问题。

Path::Class 可移植到 *nix 和 Windows 以外的操作系统。另一方面,AFAIK,它的实例比Path::Tiny 实例使用更多的内存。

如果内存是个问题,最好在while 循环中使用readdir

【讨论】:

和 reead_dir 删除 .和 .. 为您服务,如果需要,可以将目录添加到文件名中

以上是关于如何循环遍历 Perl 目录中的文件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用perl遍历一个目录下的所有文件

如何在linux中使用shell脚本遍历指定目录的文件,将创建时间大于指定时间的文件,复制到指定目录下。

使用 Perl Excel 循环遍历单列而不是每一列

js 数组遍历时删除元素

如何在linux中使用shell脚本遍历指定目录的文件,将创建时间大于指定时间的文件,复制到指定目录下。

为啥 Perl 文件 glob() 不能在标量上下文中的循环之外工作?