【发布时间】:2011-08-06 17:20:05
【问题描述】:
有一个谎言,标量上下文中的列表产生列表的最后一个元素。这是一个谎言,因为(俗话说)你不能在标量上下文中拥有一个列表。标量上下文中看起来像列表的东西实际上是标量上下文中的逗号运算符,它在标量上下文中具有不同的行为。
但是,这个逻辑似乎有一个漏洞:空列表(有时称为空列表)。字符() 是defined to be the null list by perldoc perlglossary。构造
my $s = ();
是有效代码并返回undef 到$s。这似乎没有在perldoc 中的任何地方记录(我没有检查过骆驼),但是很多代码都依赖它,所以我认为它会继续存在。
既然序言已经完成,那么问题来了:如果我们不能在标量上下文中拥有一个列表,那么我们在标量上下文中将什么称为空列表以及不将其称为列表的原因是什么(因为标量上下文中没有逗号)?
如果你喜欢这个问题,你可能也会喜欢discussion going on in P5P。
【问题讨论】:
-
有趣的问题。只是推测,所以我将其放在评论中:您示例中的括号是否真的是一个空列表,或者它们只是这样的括号:
my $x = (4 * 3) + 1;?我问,因为当我跟踪 perlglossary 中的超链接(空列表 > 列表值 > 列表上下文)时,即使是空列表似乎也取决于列表上下文的存在。 -
@FMc 一个有效点。
my $s = ()中的括号可能不是一个空列表,而是一个无值表达式(为 null)。 -
应该是报错吧?奇怪,是的,但是......看起来是一个足够明智的结果,而不是突然终止程序。
-
@pst 诀窍是在布尔上下文中大量使用空列表来表示假。
perldoc perlsyn甚至说“数字 0、字符串 '0' 和 '' 、空列表 () 和 undef 在布尔上下文中都是错误的。”这是问题的症结所在。perlsyn说你可以在标量上下文中有一个空列表,但你不能在标量上下文中有一个列表(它们在 Perl 5 中不存在)。
标签: perl list scalar-context