但是,在这个逻辑中似乎存在一个循环漏洞:空列表(有时称为空列表).字符()是defined to be the null list by perldoc perlglossary
.构造
my $s = ();
是有效的代码并将undef返回到$s.这似乎没有记录在perldoc的任何地方(我没有检查过Camel),但是很多代码都在它上面,所以我认为它就在这里.
既然序言已经完成,那么问题是:如果我们不能在标量上下文中有一个列表,那么我们在标量上下文中将什么称为空列表,什么是不将其称为列表的理由(因为没有逗号)在标量语境中)?
如果你喜欢这个问题,你可能也喜欢discussion going on in 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
……它与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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。