Почему perv autovivification не работает для ->@*, но ->@[0] работает?
Я могу получить значения путем нарезки:
($x, $y, $z) = $hash->{ key }->@[0,1,2]
Почему я не могу написать?
($x, $y, $z) = $hash->{ key }->@*
Для второго выражения в случаях, когда key
не определено в хэше, я получаю ошибку:
Не могу использовать неопределенное значение в качестве ссылки на массив в...
1 ответ
Решение
Срез получает lvalues (записываемые скаляры) для каждого указанного индекса; разыменование массива контекста списка не имеет значения l. И общее правило заключается в том, что автовивификация применяется только к lvalues.
Например ->@*
будет автовивифицировать в этом случае:
push $hash->{ key }->@*, 1;