You shouldn't use '||' for selecting between two aggregates for assignment.

@a = @b || @c; # this is wrong
@a = scalar(@b) || @c; # really meant this
@a = @b ? @b : @c; # this works fine, though

分析过程:

  1. perl 中的上下文,也就是Context:There are two major contexts: list and scalar. Certain operations return list values in contexts wanting a list, and scalar values otherwise.

  2. perl 的操作符优先级:|| 的优先级大于=

  3. The ||, // and && operators return the last value evaluated。所以,@a = @b || @c 的执行过程是先@b || @c,而@b || @c 又是先执行@b,这时候@b应该是没有list的上下文,所以返回scalar(@b),如果scalar(@b) 为真的话,那么返回值就是scalar(@b) 了,如果为假,就会去执行@c,因为@c 是|| 操作符的最后一个表达式,所以需要考虑@a 这个上下文。

暂且这样理解。


Perl

这篇文章: 有用 无用
创建 2012-02-02 20:26:53 / 更新 2013-03-23 08:42:12