gpt4 book ai didi

perl - 标量上下文中的列表赋值

转载 作者:行者123 更新时间:2023-12-04 00:39:47 24 4
gpt4 key购买 nike

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

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

最佳答案

记录在 perlop 中计算右侧的元素(赋值运算符部分的最后一句):

Similarly, a list assignment in list context produces the list of lvalues assigned to, and a list assignment in scalar context returns the number of elements produced by the expression on the right hand side of the assignment.



这样做的原因是你可以写这样的东西:
while (my ($key, $value) = each %hash) { ... }

如果它计算赋值左侧的元素数量,那将是一个无限循环。

如果您考虑一下,左侧的元素数量要么与右侧的相同,要么是一个常量(当您分配给标量列表时)。在第一种情况下,计算哪一侧没有区别,在第二种情况下,计算右手边更有用。

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

回复:您的评论 在您的示例中, (7,8)是一个二元素列表,这就是赋值运算符返回 2 的原因。当您将较短的列表分配给较长的标量列表时,右侧不会用 undef“填充”在分配发生之前。取而代之的是,任何在右侧列表中没有关联值的变量都将重置为其默认值。对于标量变量,即 undef .对于数组,这是一个空数组。对于散列,这是一个空散列。

关于perl - 标量上下文中的列表赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9307137/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com