Каков наилучший способ присвоить значение переменной "false" в perl - PullRequest
3 голосов
/ 23 марта 2012

Я хорошо знаю, что в perl есть несколько способов сделать много вещей, и мне было интересно, каков наилучший (самый эффективный, наиболее реальный, быстрый) способ присвоения значения переменной, которая является ложной (0, пустая строка, undef и т. Д.), Некоторые из них, которые я знаю:

if ( ! $x ) {
    $x = 1;
} 
# or $x = 1 if ( ! $x );

$x = $x || 1;

$x = 1 unless $x;

$x ||= 1;

Есть ли лучший вариант?

Ответы [ 2 ]

6 голосов
/ 23 марта 2012
$x ||= $default;

является коротким, четким, быстрым и широко используемым (то есть читаемым).

0 голосов
/ 23 марта 2012

Вы также можете добавить операторы // и //= (проверка на определенность).Сказав это, если разница в скорости для этих методов действительно имеет значение для вашей программы, вы можете переместить части вашего алгоритма за пределы perl и вместо этого вызывать его из perl (используя perl в качестве «клея»).

Так как в комментариях педантичная полиция повсюду в моей заднице, я потратил время, чтобы сравнить ее.Не самый лучший бенчмаркинг-проект в мире, но я все же выполнил:

time perl -e 'my $a; for (1..10000000) { $a ||= $_; }; print $a;'

time perl -e 'my $a; for (1..10000000) { $a //= $_; }; print $a;'

В моей системе версия //= последовательно 5-10% быстрееYMMV.

Предполагая, что кавычки вокруг «ложь» в исходном вопросе означают «ложь», а не строго ложь, и далее, предполагая, что undef является допустимым значением «ложь» в этом контексте, версия оператора undef имеет видпримерно на 5-10% быстрее.

Исходя из предположения, что автор вопроса ищет самый быстрый способ инициализации неинициализированной переменной, //=, вероятно, быстрее на основе простых тестов, которые я сделал,хотя мои комментарии к оптимизации в perl на этом уровне все еще стоят.

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