Подтвердить что ты не робот

Что такое // = в Perl?

Я нашел пример некоторого кода Perl, который мне нужен, но в нем было что-то, что я не узнал.

my $i //= '08';

Я нигде не могу найти ссылки на это! Он выглядит так же, как:

my $i = '08';

Я что-то пропустил?

4b9b3361

Ответ 1

Оператор //= является оператором присваивания версии // или 'logical defined-or'.

В контексте объявления переменной my переменная изначально undefined, поэтому она эквивалентна присваиванию (и будет лучше написана как my $i = '08';). В общем, однако,

$i //= '08';

является сокращением для:

$i = (defined $i) ? $i : '08';

Он задокументирован в операциях Perl (perldoc perlop) в двух местах (кратко в разделе операторов присваивания и полностью в разделе "логический определенный-или" ). Он был добавлен в Perl 5.10.0.

Ответ 2

Короткий ответ: То же, что и 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';

Ответ 3

$i //= '08' совпадает с $i = defined($i) ? $i : '08'. Это почти то же самое, что и $i ||= '08', что соответствует $i = $i ? $i : '08'. Теперь, когда вы объявляете свою переменную с my, она устанавливается на undef. Таким образом, он всегда будет следовать за ветвью 08. Кроме того, если вам интересно, оператор // появился в Perl v5.10; поэтому он будет генерировать ошибку компиляции для старых Perls.

Ответ 4

Это оператор "определенный-или".

$i //= '08';

эквивалентно:

$i = defined($i)? $i: '08';

Он был введен в Perl 5.10.0 и не поддерживается более старыми версиями.

Ответ 5

Это почти то же самое, что и ||, за исключением того, что он проверяет, определено ли $i, а не только true.