Я нашел пример некоторого кода Perl, который мне нужен, но в нем было что-то, что я не узнал.
my $i //= '08';
Я нигде не могу найти ссылки на это! Он выглядит так же, как:
my $i = '08';
Я что-то пропустил?
Я нашел пример некоторого кода Perl, который мне нужен, но в нем было что-то, что я не узнал.
my $i //= '08';
Я нигде не могу найти ссылки на это! Он выглядит так же, как:
my $i = '08';
Я что-то пропустил?
Оператор //=
является оператором присваивания версии //
или 'logical defined-or'.
В контексте объявления переменной my
переменная изначально undefined, поэтому она эквивалентна присваиванию (и будет лучше написана как my $i = '08';
). В общем, однако,
$i //= '08';
является сокращением для:
$i = (defined $i) ? $i : '08';
Он задокументирован в операциях Perl (perldoc perlop
) в двух местах (кратко в разделе операторов присваивания и полностью в разделе "логический определенный-или" ). Он был добавлен в Perl 5.10.0.
Короткий ответ: То же, что и my $i = '08';
.
Сначала рассмотрим $i //= '08';
EXPR1 //= EXPR2;
совпадает с
EXPR1 = EXPR1 // EXPR2;
за исключением того, что EXPR1 оценивается только один раз. Это удобный способ написания
EXPR1 = EXPR2 if !defined(EXPR1);
См. perlop для документации по операциям Perl.
Вернуться к my $i //= '08';
. Это означает
my $i;
$i = '08' if !defined($i);
но $i
всегда будет undefined. Было бы гораздо лучше написать
my $i = '08';
$i //= '08'
совпадает с $i = defined($i) ? $i : '08'
.
Это почти то же самое, что и $i ||= '08'
, что соответствует $i = $i ? $i : '08'
.
Теперь, когда вы объявляете свою переменную с my
, она устанавливается на undef
. Таким образом, он всегда будет следовать за ветвью 08
.
Кроме того, если вам интересно, оператор //
появился в Perl v5.10; поэтому он будет генерировать ошибку компиляции для старых Perls.
Это оператор "определенный-или".
$i //= '08';
эквивалентно:
$i = defined($i)? $i: '08';
Он был введен в Perl 5.10.0 и не поддерживается более старыми версиями.
Это почти то же самое, что и ||
, за исключением того, что он проверяет, определено ли $i
, а не только true.