分类:
2008-12-09 17:28:47
|
1.1.2 讨论
这两个方法(defined 和 ||)最大的区别是他们检测什么:defined检测相对真实。0,"0"和""这三个值在perl中默认是假值。如果你的变量已经存储量他们当中的一个,比且你希望保持这个值,那么||就无法工作了。你必须使用defined形式的更加复杂的三元测试。这对于安排你的程序是关心真或假值,还是关心值被定义和未定义,经常是很合适的。
相对于其他语言中返回值被限定只可以是1或者0,perl的||操作符有更多有趣的特性:如果第一个操作数是真的话,它返回它的第一个操作数,否则它返回第二个操作数。&&操作符还可以返回最后一个被计算到的表达式,但是这个特性很少使用。这些操作符并不关心他们的操作数是字符串,数字或参考。他们只返回第一个使整个表达式为真或假的值。这不影响返回值的布尔意义,但是却是返回的值更加有用。
这个特性将帮助我们给变量,函数,或者一个长表达式 提供一个默认值。这有一个||操作符的例子,例子中如果$bar为真则给$foo赋值为$bar,如果$bar为假,就赋值为"DEFAULT VALUE":
|
这还有一个例子:
|
如果程序的第一个参数恰好是0怎么办呢,我们就不能再使用||了,一位0是会被看做假的,尽管它就是我们需要的值也不行。我们必须采用perl中唯一的三元操作符“? :”
|
下面这行代码将使散列%count中的值自增,它的键一般是$shell,只有$shell等于假的时候为默认值“/bin/sh”:
|
你还可以把数个二选一的操作连接起来,就想下面的例子一样,第一个给出真的表达式将被返回:
|
&&操作符也完成类似的工作。但是它返回第一个等于假的操作数(表达式),因为我们更对等于真的表达式感兴趣,所以我们很少使用它。关于它的一个演示将在菜单13.12和14.19中。
“||=”这个操作符看上去有点古怪,但是他却和perl的其他二元赋值操作符一样的工作。perl中这样的操作符原理都一样:$VAR OP= VALUE 意味着 $VAR = $VAR OP VALUE; 例如:$a += $b 和 $a = $a + $b 是一个意思。所以 ||= 被用来把变量设置成它自己,除非它等于假。(||操作符只简单的检测变量是真是假,它不关心变量是否被定义)
这有一个 ||= 的例子,如果$starting_point还没被设定一个值就把它的值设成"Greenwich",这里我们假设$starting_point不应该是0或“0”。如果它真的是这样的值,那么改变它也是正确的。
|
在分配值的时候,你不可以使用or操作符取代||操作符。因为or操作符的优先级太低了。比如,$a = $b or $c 和 ($a = $b) or $c 是等效的。显然这不是你想要的。
不要以为|| 和||= 的功能可以扩展到操作数据和散列。它们不能那样工作,因为在他们左面的操作数将带来一个标量环境。所以我们必须像下面演示的那样去达到相同的目的:
|
将来perl将支持新的操作符:// //= 和err。你读这篇文章的时候它可能已经支持了。这些操作符将像逻辑操作符||一样工作,只不过它将测试变量是否被定义而不是测试真假。例如下面的每一对语句都是等效的:
|
这三个操作符已经出现在了perl的5.9版本中,这是一个测试版本,他们也将出现在5.10这个稳定版中,也将肯定用于perl6.
1.2.4 参考
操作符||的详细说明在perlop(1) 和大骆驼书的第三章;函数defined和exists在perlfunc(1)和大骆驼书29章。