Perl:使用Loop还是Map/Grep?

Dav*_* W. 5 perl grep map readdir

我正在编写一个程序来逐步浏览一个目录树(是的,我知道File :: Find,但我正在编写一个替代品).

在我的程序中,我正在readdir整个目录中执行并将其放在列表中.我需要做两件事:

  1. 删除...从列表
  2. 在每个文件前面添加当前目录名称.

我可以通过循环执行此操作,或者我可以使用mapgrep:

# Map and Grep

my @dir_stack = readdir $dir_fh;;
@dir_stack = grep { !/^\.{1,2}$/ } @dir_stack;
@dir_stack = reverse map { "$cwd/$_" } @dir_stack;
push @stack, @dir_stack;

# Read Loop

opendir $dir_fh, $cwd;
my @dir_stack;
foreach my $file (readdir $dir_fh) {
    next if $file =~ /^\.{1,2}$/;   #Skip "." and ".."
    unshift @dir_stack, "$cwd/$file";
}
push @stack, @dir_stack;
Run Code Online (Sandbox Code Playgroud)

怎么样结合grepmap

 opendir $dir_fh, $cwd;
 my @dir_stack = readdir $dir_fh;;
 @dir_stack = grep { !/^\.{1,2}$/ && {$_ = "$cwd/$_"} } @dir_stack;
 push @stack, reverse @dir_stack;
Run Code Online (Sandbox Code Playgroud)

我想让我的代码下周可读,当我看到它并试图弄清楚发生了什么.我还需要我的代码才能有效.

ike*_*ami 7

$_在grep中修改?呸!使用anon哈希构造函数有什么用?

@dir_stack = grep { !/^\.{1,2}$/ && {$_ = "$cwd/$_"} } @dir_stack;
Run Code Online (Sandbox Code Playgroud)

应该

@dir_stack = map { /^\.\.?\z/ ? () : "$cwd/$_" } @dir_stack;
Run Code Online (Sandbox Code Playgroud)

但我个人觉得使用map和grep比组合它们更具可读性.

push @stack,
   reverse
    map "$cwd/$_",
     grep !/^\.\.?\z/,
      readdir $dh;
Run Code Online (Sandbox Code Playgroud)

需要reverse相当奇怪,而且这里隐藏起来比隐藏起来更加明显unshift,所以这是另一个奖励.