我经常使用类似的东西
my $dir="/path/to/dir";
opendir(DIR, $dir) or die "can't open $dir: $!";
my @files = readdir DIR;
closedir DIR;
Run Code Online (Sandbox Code Playgroud)
或者有时我会使用glob,但无论如何,我总是需要添加一两行来过滤掉.,..这很烦人.你通常如何处理这项共同任务?
Chr*_*ung 14
my @files = grep {!/^\./} readdir DIR;
Run Code Online (Sandbox Code Playgroud)
这也将排除所有的dotfiles,但这通常是你想要的.
我经常使用File :: Slurp.好处包括:(1)如果目录不存在则自动死亡.(2)不包括在内.,..默认情况下.它的行为就像readdir是它不会返回完整的路径.
use File::Slurp qw(read_dir);
my $dir = '/path/to/dir';
my @contents = read_dir($dir);
Run Code Online (Sandbox Code Playgroud)
另一个有用的模块是File :: Util,它在读取目录时提供了许多选项.例如:
use File::Util;
my $dir = '/path/to/dir';
my $fu = File::Util->new;
my @contents = $fu->list_dir( $dir, '--with-paths', '--no-fsdots' );
Run Code Online (Sandbox Code Playgroud)
如果某些dotfiles很重要,
my @files = grep !/^\.\.?$/, readdir DIR;
Run Code Online (Sandbox Code Playgroud)
只会排除.和..
我通常会使用这个glob方法:
for my $file (glob "$dir/*") {
#do stuff with $file
}
Run Code Online (Sandbox Code Playgroud)
除非目录中包含大量文件,否则这样可以正常工作.在那些你必须切换回的情况下readdir在一个while循环(将readdir在列表环境是一样坏的glob):
open my $dh, $dir
or die "could not open $dir: $!";
while (my $file = readdir $dh) {
next if $file =~ /^[.]/;
#do stuff with $file
}
Run Code Online (Sandbox Code Playgroud)
通常,如果我正在读取目录中的一堆文件,我想以递归方式读取它们.在那些情况下,我使用File::Find:
use File::Find;
find sub {
return if /^[.]/;
#do stuff with $_ or $File::Find::name
}, $dir;
Run Code Online (Sandbox Code Playgroud)
当我只想要文件(而不是目录)时,我使用grep测试-f:
my @files = grep { -f } readdir $dir;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9917 次 |
| 最近记录: |