试执行下面一小节代码,结果是否是你预想的?
- my $a = my @a = ( 2, 3, 1 );
- my $b = 2, 3, 1;
- my $c = ( 2, 3, 1 );
- map { print "$_\n" } $a, $b, $c;
$a, $b, $c的值分别是3, 2, 和1。
$a的值为3不难理解。因为在scalar语境里@a的值是其大小,也就是@a中元素的个数,3。
$b的值为2也不难理解。2赋予$b后,3和1被扔掉了。事实上你如果启用了warnings, 编译器会抱怨 "Useless use of a constant in void context.."
要理解$c的值为1就要想一下perl的语法是怎么解析和编译的这个语句的。显然编译器在等号'='赋值前先计算了括号'()'内的值,得到的是1,再将1赋予$c。那么为什么( 2, 3, 1 )会得到1呢?
这是由于二元的','先评价它的左侧操作数并丢弃结果,然后评价右侧操作数并返回这个值。在括号里第一个逗号运算符将其左侧的2丢弃,返回右侧的3给第二个逗号运算符。第二个逗号运算符又将得到的3(位于其左侧)丢掉,返回了右侧的1。所以$c的值为1。
阅读(1176) | 评论(1) | 转发(0) |