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;
}
有没有办法优化这段代码?
有没有什么好方法可以优化此代码?
答案 0 :(得分:7)
该算法非常有效,因为它在第一项停止,但您可能想尝试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。如果模块可以加载其XS版本,any
通常在C层中运行。否则它是“Pure Perl”并且可能与你的类似。
但是,我很确定你不必测试存在和目录。我很确定如果该文件不存在,它将不会被视为目录。所以,你可以将它折叠到一个条件。
答案 1 :(得分:1)
我会将该代码编写为:
sub all_directories_exist {
my $param = shift;
# Remove first element of the array
shift @{$param};
for my $dir ( @{ $param } ) {
return unless -e $directory;
return unless -d _;
}
return 1;
}
我猜 - 尽管我没有对它进行基准测试 - 人们不能比这快得多。
两点:
不返回0
表示失败。如果在列表上下文中调用sub,您会感到惊讶。
您确定要修改$param
指向的数组吗?