如何让Perl将给定目录的内容读入数组?
反引号可以做到,但是有一些使用'scandir'或类似术语的方法吗?
opendir(D, "/path/to/directory") || die "Can't open directory: $!\n"; while (my $f = readdir(D)) { print "\$f = $f\n"; } closedir(D);
编辑:哦,对不起,错过了"进入数组"部分:
my $d = shift; opendir(D, "$d") || die "Can't open directory $d: $!\n"; my @list = readdir(D); closedir(D); foreach my $f (@list) { print "\$f = $f\n"; }
编辑2:其他大多数答案都是有效的,但我想特别评论这个答案,其中提供了这个解决方案:
opendir(DIR, $somedir) || die "Can't open directory $somedir: $!"; @dots = grep { (!/^\./) && -f "$somedir/$_" } readdir(DIR); closedir DIR;
首先,记录它正在做什么,因为海报没有:它将readdir()返回的列表传递给grep(),它只返回那些文件的值(而不是目录,设备,命名管道等)并且不以点开头(这会使列表名称@dots
误导,但这是由于他在readdir()文档中复制时所做的更改).由于它限制了它返回的目录的内容,我不认为它在技术上是这个问题的正确答案,但它说明了用于过滤Perl中的文件名的常用习惯用法,我认为它有用于记录.另一个看到的例子是:
@list = grep !/^\.\.?$/, readdir(D);
此片段从目录句柄D中读取除 "." 之外的所有内容.和'..',因为很少希望在列表中使用它们.
一个快速而肮脏的解决方案是使用glob
@files = glob ('/path/to/dir/*');
IO :: Dir很不错,并提供了一个绑定的哈希接口.
来自perldoc:
use IO::Dir; $d = IO::Dir->new("."); if (defined $d) { while (defined($_ = $d->read)) { something($_); } $d->rewind; while (defined($_ = $d->read)) { something_else($_); } undef $d; } tie %dir, 'IO::Dir', "."; foreach (keys %dir) { print $_, " " , $dir{$_}->size,"\n"; }
所以你可以这样做:
tie %dir, 'IO::Dir', $directory_name; my @dirs = keys %dir;
这将在一行中完成(注意末尾的'*'通配符)
@files = ; # To demonstrate: print join(", ", @files);
你可以使用DirHandle:
use DirHandle; $d = new DirHandle "."; if (defined $d) { while (defined($_ = $d->read)) { something($_); } $d->rewind; while (defined($_ = $d->read)) { something_else($_); } undef $d; }
DirHandle
提供了一种替代方案中,清洁器接口到opendir()
,closedir()
,readdir()
,和rewinddir()
功能.