Может ли пустой список находиться в скалярном контексте?

Существует ложь, что список в скалярном контексте дает последний элемент списка. Это ложь, потому что (как говорится) у вас не может быть списка в скалярном контексте. То, что выглядит как список в скалярном контексте, на самом деле является оператором запятой в скалярном контексте, и он имеет другое поведение в скалярном контексте.

Однако в этой логике, похоже, есть дыра в петле: нулевой список (иногда его называют пустым списком). Персонажи () определены как нулевой списокperldoc perlglossary, Конструкция

my $s = ();

действительный код и возвращает undef в $s, Это, кажется, не документировано нигде в perldoc (Я не проверял верблюда), но на него рассчитывает много кода, поэтому я думаю, что он здесь, чтобы остаться.

Теперь, когда преамбула выполнена, возникает вопрос: если у нас не может быть списка в скалярном контексте, то, что мы называем пустым списком в скалярном контексте, и что является разумным, чтобы не называть его списком (поскольку запятых нет быть в скалярном контексте)?

Если вам нравится этот вопрос, вам также может понравиться обсуждение в P5P.

2 ответа

Решение

Список - это очень общее слово. Возможно, вы имеете в виду оператор списка или значение списка.

В коде нет запятой, поэтому нет оператора списка.

В коде нет контекста списка, поэтому нет значения списка.

Поэтому в списке нет

my $s = ();

Скобки никогда не создают список

(Только косвенно, когда на LHS оператора присваивания.)

что мы называем пустой список в скалярном контексте

Perl называет это "заглушкой" (как показано ниже), и это действительно так. Это заполнитель в коде, в котором буквально ничего не будет запрещено.

Заглушка представлена ​​"пустыми скобками", так что это другое название для нее.

Я называю это плохим кодом. Если вы хотите назначить undefназначить undef,

Существует ложь, что список в скалярном контексте дает последний элемент списка.

Нет, это правда. Значения списка не могут существовать в скалярном контексте, поэтому остается оператор списка.

Оператор списка, или оператор запятой, возвращает последний элемент списка в скалярном контексте.


Сравните следующее. Нет упоминания о списке:

>perl -MO=Concise -e"my $s = ();"
6  <@> leave[1 ref] vKP/REFC ->(end)
1     <0> enter ->2
2     <;> nextstate(main 1 -e:1) v:{ ->3
5     <2> sassign vKS/2 ->6
3        <0> stub sP ->4
4        <0> padsv[$s:1,2] sRM*/LVINTRO ->5
-e syntax OK

Есть упоминание о списке

>perl -MO=Concise -e"my @a = ();"
7  <@> leave[1 ref] vKP/REFC ->(end)
1     <0> enter ->2
2     <;> nextstate(main 1 -e:1) v:{ ->3
6     <2> aassign[t2] vKS ->7
-        <1> ex-list lK ->4
3           <0> pushmark s ->4
-           <0> stub lP ->-
-        <1> ex-list lK ->6
4           <0> pushmark s ->5
5           <0> padav[@a:1,2] lRM*/LVINTRO ->6
-e syntax OK

... и это не имеет ничего общего с Parens

>perl -MO=Concise -e"my @a = 's';"
8  <@> leave[1 ref] vKP/REFC ->(end)
1     <0> enter ->2
2     <;> nextstate(main 1 -e:1) v:{ ->3
7     <2> aassign[t2] vKS ->8
-        <1> ex-list lK ->5
3           <0> pushmark s ->4
4           <$> const[PV "s"] s ->5
-        <1> ex-list lK ->7
5           <0> pushmark s ->6
6           <0> padav[@a:1,2] lRM*/LVINTRO ->7
-e syntax OK

Это больше похоже на бесполезное выражение, которое эквивалентно undef, Еще несколько примеров:

$ perl -we 'print scalar( () )'
Use of uninitialized value in print at -e line 1.

$ perl -we 'print 0+()'
Use of uninitialized value in addition (+) at -e line 1.
Другие вопросы по тегам