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

Почему || = не работает с массивами?

Я использую оператор ||= для предоставления значений по умолчанию для переменных, например

$x ||= 1;

Я попытался использовать этот синтаксис с массивом, но получил синтаксическую ошибку:

@array||= 1..3; 
Can't modify array dereference in logical or assignment (||=) ...

Что это значит и как мне предоставить массивы со значениями по умолчанию?

4b9b3361

Ответ 1

Потому что || - скалярный оператор. Если @array||= 1..3; работал, он оценил бы 1..3 в скалярном контексте, который вам не нужен. Он также оценивает массив в скалярном контексте (это нормально, потому что пустой массив в скалярном контексте является ложным), за исключением того, что вы не можете назначить scalar(@array).

Чтобы назначить значение по умолчанию, используйте:

@array = 1..3 unless @array;

Но обратите внимание, что нет способа рассказать разницу между массивом, который никогда не был инициализирован, и тем, которому был присвоен пустой список. Это не похоже на скаляр, где вы можете различать undef и пустую строку (хотя ||= не различает их).

eugene y found это сообщение perl.perl5.porters (официальный список рассылки разработчиков Perl), который более подробно рассказывает об этом.

Ответ 2

Эта страница имеет хорошее объяснение, imho:

op = может возникать между любыми двумя выражения, а не только var и выражение, но левое должно быть lvalue в скалярном контексте.

Так как @x ||= 42 эквивалентно scalar(@x) = @x || 42, и вы не разрешено использовать scalar(@x) как lvalue, вы получите сообщение об ошибке.