分类:
2008-07-08 18:00:07
和C类似,Perl提供 &&(逻辑 AND)和 ||(逻辑 OR)操作符。它们从左向右计算( && 比 || 的优先级稍稍高一点点),测试语句的真假。这些操作符被认为是短路操作符,因为它们是通过计算尽可能少的操作数来判断语句的真假。例如,如果一个 && 操作符的左操作数是假,那么它永远不会计算右操作数,因为操作符的结果就是假,不管右操作数的值是什么。
例子 | 名称 | 结果 |
$a && $b | And | 如果$a为假则为$a,否则$b |
$a || $b | Or | 如果$a为真则为$a,否则$b |
这样的短路不仅节约时间,而且还常常用于控制计算的流向。比如,一个经常出现的Perl程序的俗语是:
open(FILE, "somefile") || die "Can't open somefile: $!\n";
在这个例子里,Perl 首先计算 open 函数,如果值是真(somefile 被成功打开),die 函数的执行就不必要了,因此忽略。你可以这么读这句文本“打开文件,要不然就去死!”。
&& 和 || 操作符和 C 不同的是,它们不返回 0 或 1,而是返回最后计算的值。如果是 ||,这个特性好就好在你可以从一系列标量数值中选出第一个为真的值。所以,一个移植性相当好的寻找用户的家目录的方法可能是:
$home = $ENV{HOME}另一方面,因为左参数总是在标量环境里计算,所以你不能把 || 用于在两个集群之间选择其一进行赋值:
|| $ENV{LOGDIR}
|| (getpwuid($<)) [7]
|| die "You're homeless!\n";
@a = @b || @c; # 这样可不对Perl 还提供优先级比较低的 and 和 or 操作符,这样程序的可读性更好而且不会强迫你在列表操作符上使用圆括弧。它们也是短路的。
@a = scalar(@b) || @c; # 上面那句实际上是这个意思,@a 里只有 @b 最后的元素
@a = @b ? @b : @c; # 这个是对的