gpt4 book ai didi

Perl:使用循环还是 Map/Grep?

转载 作者:行者123 更新时间:2023-12-03 00:11:39 27 4
gpt4 key购买 nike

我正在编写一个程序来逐步浏览目录树(是的,我知道 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;

grepmap 结合起来怎么样?

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

我希望下周当我查看代码并尝试弄清楚发生了什么时,它可以可读。我还需要我的代码高效。

最佳答案

在grep中修改$_?哎呀!使用匿名哈希构造函数有什么用?

@dir_stack = grep { !/^\.{1,2}$/ && {$_ = "$cwd/$_"} } @dir_stack;

应该是

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

但我个人发现同时使用 map 和 grep 比组合使用它们更具可读性。

push @stack,
reverse
map "$cwd/$_",
grep !/^\.\.?\z/,
readdir $dh;

reverse 的需求相当奇怪,而且它在这里比隐藏为 unshift 更明显,所以这是另一个好处。

关于Perl:使用循环还是 Map/Grep?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8479919/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com