空列表可以在标量上下文中吗?

2023-12-09

有一个谎言,标量上下文中的列表会产生列表的最后一个元素。这是一个谎言,因为(正如俗话所说)你不能在标量上下文中拥有一个列表。在标量上下文中看起来像列表的实际上是标量上下文中的逗号运算符,并且它在标量上下文中具有不同的行为。

然而,这个逻辑似乎有一个漏洞:空列表(有时称为空列表)。那些角色() are 定义为空列表perldoc perlglossary。构造

my $s = ();

是有效的代码并返回undef to $s。这似乎没有记录在任何地方perldoc(我还没有检查过 Camel),但是很多代码都依赖于它,所以我认为它会继续存在。

现在序言已经完成,问题是:如果我们在标量上下文中不能有一个列表,那么我们在标量上下文中将空列表称为什么以及不将其称为列表的理由是什么(因为没有逗号)在标量环境中)?

如果您喜欢这个问题,您可能还会喜欢P5P 中正在进行的讨论.


列表是一个非常通用的词。您可能指的是列表运算符或列表值。

代码中没有逗号,因此没有列表运算符。

代码中没有列表上下文,因此没有列表值。

因此,其中没有列表

my $s = ();

括号从不创建列表

(仅在赋值运算符的 LHS 上间接进行。)

what do we call the empty list in scalar context

Perl 称其为“存根”(如下所示),这确实是它的本质。它是代码中的一个占位符,实际上不允许放置任何内容。

存根由“空括号”表示,因此这是它的另一个名称。

我称之为糟糕的代码。如果你想分配undef, 分配undef.

There is a lie that a list in scalar context yields the last element of the list.

不,确实如此。列表值不能存在于标量上下文中,因此只剩下列表运算符。

列表运算符也称为逗号运算符,返回标量上下文中列表的最后一个元素。


比较以下内容。没有提及列表:

>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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

空列表可以在标量上下文中吗? 的相关文章

随机推荐