perl - 如何优化检查目录是否存在的 Perl 代码?

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

有什么办法可以优化这段代码吗?

有什么好的方法可以优化这段代码吗?

最佳答案

该算法非常有效,因为它停在第一项,但您可能想给出 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/

相关文章:

mysql - DBD::mysql fetchrow_array 失败:没有 execute() 的 fetch()?

java - 延迟处理客户端数据: Treat java socket id as a file id

perl - 使用perl将内容从一个文件复制到另一个文件

Perl内存分配

perl - 为什么 "use overload"不能与 "use namespace:autoclean"一起使用?

perl - -> 运算符在 Perl 中有什么作用?

perl - 从当前目录调用 perl 模块

perl - 将 Word doc 或 docx 文件转换为文本文件?

php - 使用 Javascript 在客户端机器上监听套接字

perl - 使用 XML::Twig 处理嵌套元素