Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何优化检查目录存在性的Perl代码?_Perl - Fatal编程技术网

如何优化检查目录存在性的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;
    }