标量上下文中的列表赋值

Bri*_*ian 12 perl scalar list variable-assignment

标量上下文中的列表赋值返回右侧的元素数:

scalar(my ($hello, $there, $world) = (7,8)); #evaluates to 2
Run Code Online (Sandbox Code Playgroud)

为什么它评估右侧并生成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
Run Code Online (Sandbox Code Playgroud)

cjm*_*cjm 15

记录在perlop中计算右边的元素(Assignment Operators部分中的最后一句):

类似地,列表上下文中的列表赋值生成分配给的左值列表,标量上下文中的列表赋值返回由赋值右侧的表达式生成的元素数.

它的工作原理是这样你可以写这样的东西:

while (my ($key, $value) = each %hash) { ... }
Run Code Online (Sandbox Code Playgroud)

如果计算分配左侧的元素数量,那将是无限循环.

如果考虑一下,左侧的元素数量与右侧的元素数量相同,或者它是一个常量(当您分配到标量列表时).在第一种情况下,您计算哪一方没有区别,而在第二种情况下,计算右侧更有用.

另一方面,在列表上下文中,赋值运算符返回左侧列表,因为它更有用.如果在修改列表元素的上下文中使用它,则需要修改刚分配给的变量.

回复:您的评论 在您的例子,(7,8)是两个元素的列表,这就是为什么赋值运算符当您指定一个较短的列表,标量的长列表返回2,右手边是不是"填补了"与undef前分配发生了.相反,右手列表中没有与其关联的值的任何变量都将重置为其默认值.对于标量变量,那就是undef.对于数组,这是一个空数组.对于哈希,这是一个空哈希.


ike*_*ami 6

对我来说,上下文影响评估哪一方似乎很奇怪:

它没有.评估列表赋值运算符的双方(操作数),以及是否在标量上下文或列表上下文中评估列表赋值不会影响操作数的评估.

在标量上下文或列表上下文中评估列表赋值是否仅影响它返回的值.

我之前创建过Scalar vs List Assignment Operator,它试图弄清楚两个赋值运算符之间的差异以及它们在标量和列表上下文中的行为方式.