sub DirectoryExists {
my $param = shift;
# Remove first element of the array
shift @{$param};
# Loop through each directory to see if it exists
foreach my $directory (@{$param}) {
unless (-e $directory && -d $directory) {
return 0;
}
}
# True
return 1;
}
有什么办法可以优化这段代码吗?
有什么好的方法可以优化这段代码吗?
最佳答案
该算法非常有效,因为它停在第一项,但您可能想给出 List::Util::first
一试。
use List::Util qw<first>;
#...
return defined first { -e && -d } @$param;
唯一的主要优化是它在 C 层运行。它也是 Perl 中一个非常容易识别的习语,因此尽管看起来像高尔夫,但目的是“说 perl”,而不是高尔夫。
List::MoreUtils::any
会给你类似的效果,而且,它更适合你想要表达的内容:你问的是数组中是否有目录。 (尽管有一个提示,堆栈参数传递比构建引用并传递它要快一点到快得多——至少在我的测试中是这样。)
无论如何,这是它的样子:
return any { -e && -d } @$param;
表示如果满足该表达式则返回 true。 any
通常在 C 层运行,如果模块可以加载其 XS 版本。否则它就是“纯 Perl”并且可能与您的运行方式类似。
但是,我很确定您不必同时测试是否存在和目录。我很确定如果文件不存在,它不会被视为目录。所以,你可以把它折叠成一种情况。
关于perl - 如何优化检查目录是否存在的 Perl 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3071438/