在标量上下文列表赋值

问题描述 投票:12回答:3

在标量上下文中的列表赋值返回右手边的元素个数:

scalar(my ($hello, $there, $world) = (7,8)); #evaluates to 2

为什么它评估的右手边,并产生2,而不是新定义的列表进行评估并返回3?

对我来说,它看起来像$hello得到7,$there得到8,和$world得到undef,则该列表是在标量上下文,这将导致在3评价,因为这是在列表中($hello $there $world)元素的数量。这似乎不可思议,我认为上下文影响返回该评估表达式的一部分:

my $greeting = (($hello, $there, $world) = (7,8)); #2

my @greeting = (($hello, $there, $world) = (7,8));
my $greeting_length = @greeting; #3
perl list variable-assignment scalar
3个回答
15
投票

它的记录数(在赋值运算符节的最后一句)在perlop右边的元素:

类似地,在列表上下文列表分配产生分配给左值的列表中,并在标量上下文列表分配返回通过在分配的右手侧的表达式产生的元素的数量。

它的工作原理是一样的原因是,你可以这样写:

while (my ($key, $value) = each %hash) { ... }

如果算的上分配的左手侧元件的数目,这将是一个无限循环。

如果你想想看,在左侧的元素个数要么是一样的右手边,或者它是一个常数(当你分配给标量的列表)。在第一种情况下,它没有什么区别,你算哪一方,而在第二种情况下,计算右手边是比较有用的。

在另一方面,在列表上下文赋值操作符返回左侧列表中,因为这是更加有用。如果您在修改的列表元素上下文中使用它,你想修改刚刚分配到的变量。

回复:您的评论在您的例子,(7,8)是两个元素的列表,这就是为什么赋值运算符当您指定一个较短的列表,标量的长列表返回2,右手边是不是“填补了”有undef之前的分配情况。相反,那些没有与他们从右手列表关联的值的变量被重置为默认值。对于一个标量,这是undef。对于数组,这是一个空数组。对于哈希值,这是一个空的哈希值。


6
投票
It seems weird to me that context effects which side is evaluated:

事实并非如此。列表赋值运算符的两边(操作数)评价,该列表指定是否在标量上下文或列表环境评估,不影响任何操作数的评价。

无论列表分配在标量上下文或列表环境中求只会影响其返回值。

我以前创建Scalar vs List Assignment Operator,它试图弄清楚这两个赋值操作符,以及它们如何在标量和列表环境行为之间的区别。


0
投票

为什么它评估的右手边,并产生2,而不是新定义的列表进行评估并返回3?

因为这是语言定义说,它应该做的,因为这是拉里·沃尔决定了它应该做的。

对我来说,这似乎是$招呼得到7,$有得到8,和$世界变得民主基金,然后该列表在标量环境

不,Perl不这样的。你假设标量上下文只是说会在列表上下文中通过计算列表中的结果元素的数量获得一个标结果的转换,但是这根本就不是正确的...标量上下文意味着操作(在这种情况下分配)应该产生一个标量的结果,并且有比在列表上下文结果的要素的只是数量更多有用的频繁标量结果,以及从运营商而异操作...你要检查的文件什么标生产;它的不统一。对于名单分配,标量值是右侧元素的数量,因为这是远远大于接收器的数量,这是不变的更加有用。例如,if (($a, $b) = $s =~ /$re/)为真,如果匹配产生的结果,而不是因为有两个接收器总是为真。

这似乎不可思议,我认为上下文影响返回该评估表达式的一部分

有在Perl远怪异的事情。古怪的感觉来自模型之间的不匹配......在这种情况下,您的正交性的期望和你的信念是“标量上下文”列表上的运营商,与Perl的实用设计与现实“标量上下文”建立上下文它决定什么结果产生。请注意,您可以编写产生完全取决于调用的上下文不同的结果,自己的函数。

© www.soinside.com 2019 - 2024. All rights reserved.