列表是一个非常通用的词。您可能指的是列表运算符或列表值。
代码中没有逗号,所以没有列表运算符。
代码中没有列表上下文,所以没有列表值。
因此,没有清单
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
...它与括号无关
>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