Perl readdir作为一个单行程?

时间:2015-05-06 17:50:15

标签: perl glob syntactic-sugar readdir

截至目前,我知道在Perl中打开和读取目​​录的两种方法。您可以使用opendirreaddirclosedir,也可以只使用glob获取目录的内容。

示例:

使用opendirreaddirclosedir

opendir my $dh, $directory;
my @contents = readdir $dh;
closedir $dh;

使用glob

my @contents = <$directory/*>;

我被告知在某些情况下glob方法会产生不可预测的结果(例如,当它遇到目录名中的特殊字符时,它可能在不同的操作系统上采取不同的行为)。

我对glob方法的喜爱是它的“快速和肮脏”。这是一个简单的界限,它完成了工作,但如果它不能在所有可能引入意外和难以发现的错误的情况下工作。

  

我想知道是否有某种“速记”方式来使用   opendirreaddirclosedir方法?

我最近发现的一行中可能有类似fancy method for slurping a file的内容。

2 个答案:

答案 0 :(得分:2)

以下情况如何?

my @contents = get_dir_contents($dir);

如果应返回.,是否应返回..,是否应返回“隐藏”文件以及路径是否预先附加到文件,您甚至可以决定如何处理错误你自己写get_dir_contents以来的名字。

备选方案:

  • use File::Find::Rule qw( );
    my @contents = File::Find::Rule->maxdepth(1)->in($dir);
    
  • use File::Slurp qw( read_dir );
    my @contents = read_dir($dir);
    
  • # Unix only, but that includes cygwin and OS/X.
    my @contents = <\Q$dir\E/.* \Q$dir\E/*>;
    

答案 1 :(得分:0)

我相信我已经提出了一个有效的单行内容,涉及opendir / readdir

my @contents = do { opendir my $dh, $dir or die $!; readdir $dh };

这应该打开并读取目录,返回其所有内容,一旦do块结束,$dh应该由Perl&#34;自动关闭&#34;。< / p>