如何优化检查目录存在的Perl代码?

时间:2010-06-18 16:30:30

标签: perl

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;
}

有没有办法优化这段代码?

有没有什么好方法可以优化此代码?

2 个答案:

答案 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;
}

我猜 - 尽管我没有对它进行基准测试 - 人们不能比这快得多。

两点:

  1. 返回0表示失败。如果在列表上下文中调用sub,您会感到惊讶。

  2. 您确定要修改$param指向的数组吗?