今天遇到一个问题,查很久,终于有结果。
代码片段简单如下:
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
需要注意下。。。
阅读(1133) | 评论(0) | 转发(0) |