可能重复:
How can I list all of the files in a directory with Perl?
我想循环遍历同一目录中包含的几百个文件。我将如何在Perl中执行此操作?
答案 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)
或者,您可以使用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
。