Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59601
  • 博文数量: 10
  • 博客积分: 393
  • 博客等级: 一等列兵
  • 技术积分: 124
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-09 09:37
文章分类

全部博文(10)

文章存档

2012年(1)

2011年(5)

2010年(4)

我的朋友

分类: Python/Ruby

2011-12-15 17:24:39

今天遇到一个问题,查很久,终于有结果。
代码片段简单如下:

foreach(keys %some_hash)
{
$a=func1() or next;
func2;
}
就上面简单一句,发现func2有时候能执行有时候不执行。

当时我就觉得奇怪了,明明就是一顺序执行的语句,为什么会跳跃执行呢??

后来查很久,终于找到原因! 就是由于next导致了跳跃性执行!!

原因如下:
   语句: $a=func1() or next;
   执行顺序: 先执行func1(),然后是func1结果的赋值操作,然后赋值操作的结果 作为or的条件,看是否执行next语句,如果不执行next,则执行func2。
 
   这时候有人就会说了,赋值操作么,只要不出现内存溢出之类的,怎么可能赋值失败呢?

   其实这样的理解是错误的。 当赋值操作作为一个判断条件的时候,最终返回值不是“赋值是否成功!”,而是 “等式右边的值”作为最终返回值!!
   众所周知,perl是一个没有严格变量类型的语言,当func1函数的执行结果恰好为0或者“”空字符串的时候,对perl来说,赋值表达式是false的!!!导致后面的next函数执行,从而跳过了func2函数的执行!!


可以验证下:
#!/usr/bin/perl
use strict;

my $a;
if($a = 0 or $a = "")
{
     print "true\n";
}else
{
    print "false\n";
}

执行结果:
false

需要注意下。。。
阅读(1099) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~