Chinaunix首页 | 论坛 | 博客
  • 博客访问: 44568
  • 博文数量: 7
  • 博客积分: 173
  • 博客等级: 入伍新兵
  • 技术积分: 115
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-06 18:31
文章分类
文章存档

2012年(7)

我的朋友

分类: Python/Ruby

2012-08-07 00:44:33

试执行下面一小节代码,结果是否是你预想的?

点击(此处)折叠或打开

  1. my $a = my @a = ( 2, 3, 1 );
  2. my $b = 2, 3, 1;
  3. my $c = ( 2, 3, 1 );

  4. 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) |
0

上一篇:人人招聘

下一篇:常用Perl开发工具

给主人留下些什么吧!~~

努力小伙2012-08-08 14:52:01

good