如何在Perl中的目录中循环文件?

时间:2010-01-27 18:29:58

标签: perl file

  

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

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

3 个答案:

答案 0 :(得分:46)

#!/usr/bin/perl -w

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

其中

 @files = <*>;

可以

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

答案 1 :(得分:19)

享受。

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
}

答案 2 :(得分:13)

您可以使用readdirglob

或者,您可以使用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实例使用更多内存。

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