@rt = (10,9,8);
my ($x)=@rt;
$y = @rt;
$z = (10,9,8);
print "\$x=$x,\$y=$y,\$z=$z\n";
输出: $ X = 10,$ Y = 3,$ Z = 8
为什么$ x,$ y,$ z的值不同? 为什么$ z值不等于@rt的大小?
$x = $rt[0]
$y = Scalar(@rt)
$z = $rt[2]
为什么将数组赋值给标量的差别不同?这让我觉得Perl很乏味,或者在编码时需要小心。请评论它。
答案 0 :(得分:9)
Perl有两个不同的赋值运算符,一个标量赋值运算符和一个列表赋值运算符。哪个作业,在语法上基于左边的内容;如果它是一个数组,一个散列,一个切片或一个带括号的表达式,那么它就是一个列表赋值;否则它是一个标量赋值。列表赋值给出了右操作数列表上下文;标量赋值给出了它们的右操作数标量上下文。
一次一个:
@rt = (10,9,8);
列表分配。右操作数获取列表上下文。列表上下文中的逗号运算符汇编了一个列表,然后将其分配到数组中。
my ($x) = @rt;
列表分配。右操作数获取列表上下文;列表上下文中的数组生成其元素列表,这些元素被分配到列表中,该列表是左操作数的列表赋值。因为该列表只有一个标量元素,所以只会分配数组的第一个元素,并且会丢弃从该数组生成的列表的其余元素。
$y = @rt;
标量赋值。右操作数获得标量上下文;标量上下文中的数组产生其长度,该长度分配给赋值左侧的变量。
$z = (10,9,8);
标量赋值。右操作数获取标量上下文。标量上下文中的逗号运算符抛弃其左操作数并仅返回其右操作数,因此赋值的左操作数的值只是数字8,它被赋值给赋值左侧的变量。
答案 1 :(得分:2)
左侧的变量列表(列表上下文)和右侧的列表指定相应的项目。左侧第一个也是唯一的项目从列表中获取第一个项目:
my ($x)=@rt; # x = rt[0]
左侧标量,右侧列表。列表在标量上下文中进行评估,转换为其长度:
$y = @rt; # y = size of rt
最后一个是comma operator,在标量上下文中,它评估为右侧的最后一项。
$z = (10,9,8); # z = 8;