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

Почему список undef не доступен для чтения или постоянного значения в Perl?

Рассмотрим следующие программы в Perl.

use strict;
use warnings;

my @foo = qw(a b c);
undef = shift @foo;

print scalar @foo;

Это будет умирать с сообщением об ошибке:

Модификация значения, доступного только для чтения,...

Использование константы даст другую ошибку:

1 = shift @foo;

Невозможно изменить постоянный элемент в скалярном задании на... Выполнение... отменено из-за ошибок компиляции.

То же самое, если мы это сделаем:

(1) = shift @foo;
Все это имеет смысл для меня. Но размещение undef в списке будет работать.
(undef) = shift @foo;

Теперь он печатает 2.

Конечно, это обычная практика, если у вас есть куча возвращаемых значений и нужны только конкретные, например здесь:

my (undef, undef ,$mode, undef ,$uid, $gid, undef ,$size) = stat($filename);

Пример 9-й строки кода в perldoc -f undef показывает это, но нет объяснений.

Мой вопрос: как это обрабатывается внутри Perl?

4b9b3361

Ответ 1

Внутри Perl имеет разные операторы для скалярного присваивания и назначения списка, хотя оба они пишутся = в исходном коде. И оператор присваивания списка имеет специальный случай для undef, о котором вы спрашиваете.