为什么这些不同的分配数组/列表的方法会产生不同的值?

时间:2014-10-07 07:19:13

标签: arrays perl

@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很乏味,或者在编码时需要小心。请评论它。

2 个答案:

答案 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;