Да, догадка правильная. Только не переменную, а её значение.
Соответствующий мануал - perlop, но читать надо про оператор //. А //= работает по той же схеме, что и все остальные операторы такого рода. $x = $x // "default value".
До сих пор и со строками тоже работало. Надо смотреть в код, вероятно, там какая-то другая ошибка.
Тонкость: может отличаться значением всего выражения целиком. Я сходу не помню, каково значение оператора присваивания, но рискну предположить, что это присвоенное значение. Т.е. если значение $a определено, то в первом случае будет это значение, а во втором undef.
Да, я понимаю, что маньяков, использующих значение оператора присваивания, гм, хвалить не следует, ибо код получается нечитаемым. Но разница, тем не менее, есть.
Comments 11
Соответствующий мануал - perlop, но читать надо про оператор //. А //= работает по той же схеме, что и все остальные операторы такого рода. $x = $x // "default value".
До сих пор и со строками тоже работало. Надо смотреть в код, вероятно, там какая-то другая ошибка.
Reply
$a //= $b;то же самое, что и
$a = $b unless defined $a;
Reply
Да, я понимаю, что маньяков, использующих значение оператора присваивания, гм, хвалить не следует, ибо код получается нечитаемым. Но разница, тем не менее, есть.
Reply
$a = "a";
$b = "b";
$a //= $b;
say $a;
$a = undef;
$a //= $b;
say $a;
выводит
a
b
Reply
$a //= $b - это выражение, у него есть значение.
$a = $b unless defined $a - это оператор.
То есть, например, написать print($a //= $b) можно, а print($a = $b unless defined $a) - синтаксическая ошибка.
Хотел было написать, что $a //= $b; (с ; в конце, т.е. оператор) будет и правда то же самое, но... Можно написать
sub f1 {
my $x = "x";
my $y = "y";
$x //= $y;
}
sub f2 {
my $x = "x";
my $y = "y";
$x = $y unless defined $x;
}
printf("f1=%s\n", f1());
printf("f2=%s\n", f2());
и... внезапно выяснится, что результаты разные:
f1=x
f2=1
Reply
Reply
Leave a comment