Как я могу оптимизировать код Perl, который проверяет существование каталога? - PullRequest
2 голосов
/ 18 июня 2010
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 ]

7 голосов
/ 18 июня 2010

Этот алгоритм довольно эффективен, потому что он останавливается на первом элементе, но вы можете попробовать List::Util::first.

use List::Util qw<first>;
#...

return defined first { -e && -d } @$param;

Единственной серьезной оптимизацией было бы то, что она работает на C-слое.Это также довольно узнаваемая идиома в Perl, и поэтому, несмотря на внешний вид гольфа, цель состоит в том, чтобы «говорить на Perl», а не в гольфе.

List::MoreUtils::any даст вам аналогичный эффект, а также он лучше соответствует тому, что вы пытаетесь выразить: вы спрашиваете, являются ли какие-либо в массиве каталогами.(хотя подсказка, что передача параметров стека происходит немного быстрее, чем создание ссылки и ее передача - по крайней мере, в моих тестах.)

В любом случае, вот как это выглядит:1016 * Означает возвращение true, если оно удовлетворяет этому выражению.any часто выполняется на уровне C, если модуль может загрузить свою версию XS.В противном случае это «Pure Perl» и, вероятно, работает аналогично вашему.

Тем не менее, я уверен, что вам не нужно проверять наличие и каталог.Я уверен, что если файл не существует, он не будет рассматриваться как каталог.Таким образом, вы можете свернуть его до одного состояния.

1 голос
/ 18 июня 2010

Я бы написал этот код как:

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

Я предполагаю, что & mdash; хотя я не проверял это & ​​mdash; никто не может стать намного быстрее, чем это.

Два очка:

  1. Do NOT возврат 0 для указания сбоя. Вы будете удивлены, если ваша подпрограмма вызывается в контексте списка.

  2. Вы уверены, что хотите изменить массив, на который указывает $param?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...