Почему || = не работает с массивами? - PullRequest
17 голосов
/ 08 декабря 2010

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

$x ||= 1;

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

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

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

Ответы [ 2 ]

18 голосов
/ 08 декабря 2010

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

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

@array = 1..3 unless @array;

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

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

16 голосов
/ 08 декабря 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...