Потому что ||
- скалярный оператор. Если @array||= 1..3;
сработает, он оценит 1..3
в скалярном контексте, а это не то, что вам нужно. Он также оценивает массив в скалярном контексте (что нормально, поскольку пустой массив в скалярном контексте равен false), за исключением того, что вы не можете присвоить scalar(@array)
.
Чтобы назначить значение по умолчанию, используйте:
@array = 1..3 unless @array;
Но учтите, что невозможно определить разницу между массивом, который никогда не был инициализирован, и массивом, которому был назначен пустой список. Это не скаляр, где вы можете различить undef
и пустую строку (хотя ||=
не различает их).
eugene y found это сообщение perl.perl5.porters (официальный список рассылки разработчиков Perl), в котором более подробно об этом.