perl – 标量语法中的列表赋值

标量上下文中的列表分配返回右侧的元素数:
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.对于数组,这是一个空数组.对于散列,这是一个空的哈希.

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...