1.6.1 什么是真 ? |
我们已谈论到术语真[1], 并且我们提到某类操作符返回真或假值。在我们继续以前,真应该确切地解释那是什么意思。Perl对待"真"有点不同于多数计算机语言, 但在你用它一段时间后, 你将有许多感受(事实上, 我们希望你读完下面后感受到许多)。
[1]严格地说, 这不是真的。
Perl基本上保留"真"是"自显的"。那就是说你能计算几乎任何真值。Perl根据你计算的类型使用真的实际定义。真比非真有许多种类型。
Perl中, 真总是在一个标量上下文被计算。(否则, 不做类型强制)所以, 这儿有对于一个标量所能保留各类值的规则:
1. 除了""和"0"以外, 任何字符串都是真的。
2. 除了0以外, 任何数字都是真的。
3. 任何引用都是真的。
4. 任何无定义的值都是假的。
实际上,后两个规则能从前两个导出。任何引用(规则3)都指向一个地址, 并计算包含这个地址的一个数字或一个字符串, 这个地址永远不是0。并且任何无定义的值将总是0或空串。
以某种方式,如果你假设每个事都是一个串, 你能从规则1导出规则2。为计算真, 实际上没有强制, 但如果对串做强制, 那么0的任何数字值将转为字符串"0", 并且是假。任何其他数字将不转为字符串"0", 所以是真。让我们看些例子,这样我们能更明白一点儿:
0 #将成为字符串"0", 所以是假
1 #将成为字符串"1", 所以是真
10-10 #10-10是0, 将转为字符串"0", 所以是假
0.00 #成为0, 将转为字符串"0", 所以是假
"0" #字符串"0", 所以为假
"" #一个空串, 所以为假
"0.00" #字符串"0.00", 既不是空又不是"0", 所以为真
"0.00" + 0 #数字0(被加号强制), 所以是假
a #对$a的一个引用, 所以甚至$a为假, 结果为真
undef() #返回无定义的一个函数, 所以为假
自从我们以前谈论到真是在一个标量上下文被计算的以来, 你可能一直想知道一个表的真值是什么。简单的事实是,在Perl的一个标量上下文中, 没有操作返回一个表。相反,他们都返回一个标量值,然后对这个标量值应用规则。所以没有问题,只要你能想出任何给定操作符在一个标量上下文将返回什么。
if和unless语句
前面, 我们看到一个逻辑操作符怎样象一个条件一样起作用。逻辑操作符的更复杂形式是if语句。if语句计算一个真的条件, 并且条件为真时, 执行一个block。
一个block是由一对括号包括的一个或多个语句。因为if语句执行一个block, 所以根据定义要有括号。如果你知道象C一样的语言, 你将注意这是不同的。在C中括号是可选的, 如果你只有一行程序, 但在Perl中, 他们不是可选的。
if ($debug_level > 0) {
# 提示行, 告诉用户错误新息
print "Debug: Danger, Will Robinson, danger!";
print "Debug: Answer was '54', expected '42'.\n";
}
有时, 当条件满足时只执行一个block, 这是不够的。如果条件不满足时,你也 想执行一个不同的block。当然你能使用两个if语句, 一个条件是另一个条件的相反条件, 而Perl提供一个更好的方法。在block之后, if能有第二个选择条件, 称为else, 只有真条件为假时, 才被执行。(老练的编程者对这点不惊奇)
其他时候, 你甚至有多于两个的可能选择。这时,你将想为另一个可能的选择加一个elsif的真条件。(老练的编程者可能被这个elsif的发音感到惊奇, 这儿没有人道歉。)
if ($city eq "New York") {
print "New York is northeast of Washington, D.C.";
}
elsif ($city eq "Chicago") {
print "Chicago is northwest of Washington, D.C.";
}
elsif ($city eq "Miami") {
print "Miami is south of Washington, D.C. And much warmer!";
}
else {
print "I don't know where $city is, sorry.";
}
if和elsif从句是按次序计算的, 直到某个条件为真或else条件满足。当某个条件为真时,执行相应的block并且跳过其余分支。有时,如果条件为真时, 你不想做任何事情, 只有条件为假时才做。使用一个空if和一个else是麻烦的, 而一个相反的if是不合法的; 这是在说" 如果这个不是真时, 做事情"。在这种情况,你将使用unless语句。
unless ($destination eq $home)
print "I'm not going home.";
这儿没有"elsunless"。
Copyright: NPACT |