如何优化检查目录存在性的Perl代码?
有没有办法优化这段代码如何优化检查目录存在性的Perl代码?,perl,Perl,有没有办法优化这段代码 有什么好方法可以优化这段代码吗?该算法非常有效,因为它会在第一项停止,但您可能想尝试一下 如果任何表达式满足该表达式,则表示返回trueany通常在C层运行,前提是模块可以加载其XS版本。否则它就是“纯Perl”,运行方式可能与您的类似 但是,我非常确定您不必同时测试存在性和目录。我很确定,如果文件不存在,它就不会被视为目录。所以,你可以把它折叠成一个条件 我会将代码编写为: return any { -e && -d } @$param; 我猜——尽管
有什么好方法可以优化这段代码吗?该算法非常有效,因为它会在第一项停止,但您可能想尝试一下 如果任何表达式满足该表达式,则表示返回true
any
通常在C层运行,前提是模块可以加载其XS版本。否则它就是“纯Perl”,运行方式可能与您的类似
但是,我非常确定您不必同时测试存在性和目录。我很确定,如果文件不存在,它就不会被视为目录。所以,你可以把它折叠成一个条件 我会将代码编写为:
return any { -e && -d } @$param;
我猜——尽管我还没有对它进行基准测试——一个人不可能比这更快
两点:
0
,以指示故障。如果在列表上下文中调用子对象,您会感到惊讶$param
指向的数组这取决于你期望它做什么。你能给出一个如何调用它的例子吗?你可以在你的代码中省略
-e
测试。为了提高效率,你可以使用{-e&&d}
来确保stat
每一次只调用一次file@Eric斯特罗姆:我觉得你的优化其实有点可笑——是的,它可以工作,并且可以节省一个内核文件系统操作,但是正如Axeman和planetp所指出的,这也是:{-d}
:)只是一个猜测-也许OP想要移位
,以摆脱典型目录列表中的
或项。
项。@Zaid:是的,这是您可能想要做的事情,但Sinan的意思是,shift
实际上在修改调用方的数组——这可能不是您想要做的事情。如果这是我的本意的话,我会在旁边放一个响亮的评论。啊,好吧,这是我之前发表评论时想到的第二次shift
。@Zaid:嗯,我也在说第二次shift
$param
是对调用方拥有的数组的引用<代码>shift@{$param}将修改该数组。@j_random_hacker:同意,这是因为第一个移位
导致$param
引用调用方数组。它不像@
那样创建词汇副本。
use List::Util qw<first>;
#...
return defined first { -e && -d } @$param;
return any { -e && -d } @$param;
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;
}