Perl readdir 作为一个单行?

Perl readdir as a one-liner?

到目前为止,我知道在 Perl 中打开和读取目​​录的两种方法。您可以使用 opendirreaddirclosedir 或者您可以简单地使用 glob 来获取目录的内容。


示例:

使用opendirreaddirclosedir

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

使用glob:

my @contents = <$directory/*>;

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

我喜欢 glob 方法的地方在于它 "quick and dirty" 的样子。这是一条简单的线,它完成了工作,但如果它不能在所有情况下工作,可能会引入意外且难以发现的错误。

I was wondering if there was a sort of "shorthand" way to use the opendir, readdir, closedir method?

也许像这样 在我最近发现的一行中。

下面的怎么样?

my @contents = get_dir_contents($dir);

您甚至可以决定如何处理错误,是否应返回 .,是否应返回 ..,是否应返回 "hidden" 文件以及路径是否为由于您自己编写 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/*>;
    

我相信我想出了一个有效的单行代码,其中涉及 opendir/readdir!

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

这应该打开并读取目录,return 它的所有内容,一旦 do 块结束,$dh 应该被 Perl 关闭 "automagically".