Что делает оператор //= ?

Aug 02, 2021 21:10

Наткнулся на gihub на использование оператора //= Ни разу раньше не видел его использования ( Read more... )

Leave a comment

Comments 11

besm6 August 2 2021, 18:28:43 UTC
Да, догадка правильная. Только не переменную, а её значение.

Соответствующий мануал - perlop, но читать надо про оператор //. А //= работает по той же схеме, что и все остальные операторы такого рода. $x = $x // "default value".

До сих пор и со строками тоже работало. Надо смотреть в код, вероятно, там какая-то другая ошибка.

Reply


den_rybakov August 2 2021, 18:38:08 UTC

$a //= $b;то же самое, что и

$a = $b unless defined $a;

Reply

besm6 August 2 2021, 19:14:35 UTC
Тонкость: может отличаться значением всего выражения целиком. Я сходу не помню, каково значение оператора присваивания, но рискну предположить, что это присвоенное значение. Т.е. если значение $a определено, то в первом случае будет это значение, а во втором undef.

Да, я понимаю, что маньяков, использующих значение оператора присваивания, гм, хвалить не следует, ибо код получается нечитаемым. Но разница, тем не менее, есть.

Reply

den_rybakov August 2 2021, 19:36:57 UTC
простой пример

$a = "a";
$b = "b";
$a //= $b;
say $a;
$a = undef;
$a //= $b;
say $a;
выводит

a
b

Reply

besm6 August 3 2021, 05:25:59 UTC
Я не про то. Впрочем, я тоже ошибся. Там разница уже на уровне синтаксиса.

$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


eldhenn August 3 2021, 07:39:30 UTC
Вот это некромантия!

Reply


Leave a comment

Up