标量上下文中的列表分配返回右侧的元素数:
scalar(my ($hello,$there,$world) = (7,8)); #evaluates to 2
为什么它评估右手边并产生2,而不是新定义的列表被评估和返回3?
对我来说,似乎$hello得到7,$有8,$world获取undef,那么该列表在标量上下文中被评估,这将导致3,因为列表中的元素数量($hello $there $world).对我来说似乎很奇怪,上下文影响返回的评估表达式的哪一部分:
my $greeting = (($hello,8)); #2 my @greeting = (($hello,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) { ... }
如果它计算了赋值左边的元素数量,那将是一个无限循环.
如果您考虑到这一点,左侧的元素数量可能与右侧相同,或者是常数(当您分配到标量列表时).在第一种情况下,您计算的方面没有什么不同,在第二种情况下,计数右侧更有用.
另一方面,在列表上下文中,赋值运算符返回左侧列表,因为这更有用.如果您在修改列表元素的上下文中使用它,则要修改刚分配给的变量.
Re:你的评论在你的例子中,(7,8)是一个双元素列表,这就是为什么赋值操作符返回2.当你将一个较短的列表分配给一个更长的标量列表时,右边不是“填充在发生任务之前,使用undef.相反,没有与右侧列表相关联的值的任何变量都将重置为其默认值.对于一个标量变量,那就是undef.对于数组,这是一个空数组.对于散列,这是一个空的哈希.