条件判断:if、unless和三元运算

if和unless都是条件判断语句,它们都支持else子句和任意数量的elsif子句。语法如下;

if(COND){  # 或者 unless(COND)
  command
}

if(COND1){  # 或者 unless(COND1)
  command1
}elsif(COND2){
  command2
}elsif(COND3){
  command3
} else {
  commandN
}

if(COND){  # 或者 unless(COND)
  command1
}else{
  command2
}

注意,COND可以是任意一个表示布尔值的值或表达式,它是一个标量上下文。Perl中任何一个需要进行条件判断的地方都是标量上下文。

例如:

# 如果默认变量$_中有换行符,则去除换行符后使用say输出
if(chomp){  # chomp操作字符串时返回1或0
  say $_;
}

# 如果数组元素数量大于等于5,则输出前5个元素
if(@arr >= 5){
  say "@arr[0..4]";
}

unless和if判断方式相反,对于if,条件为真时执行紧跟着的语句块,对于unless,条件为假时执行紧跟着的语句块。所以,unless相当于if的else部分,或者说unless(cond)相当于if(!cond)

# 除非数组元素数量小于5,否则就输出前5个元素
unless(@arr < 5){
  say "@arr[0..4]";
}

多数时候,只会用到unless的单分支,不会用到unless的else或elsif子句,因为这样的逻辑可以改写成等价但更易懂的if语句。

三元运算符

Perl也支持三元运算符:如果expr返回真,则执行并返回when_true的结果,否则执行并返回when_false的结果。

expr ? when_true : when_false

例如,求平均值,如果$n=0,则输出------

$avg = $n ? $sum/$n : "------";

注意上面示例中的优先级问题,赋值运算符=的优先级只比not and or和逗号运算符的优先级高,因此赋值操作几乎总是在最后才执行。

三元运算符是对if(expr){when_true}else{when_false}的简写。例如上面示例等价于下面的if逻辑:

if($n){
    $avg = $sum / $n;
}else{
    $avg = "------";
}

三目运算符可以写出更复杂的分支:

# 如果$score小于60分,则mark为c
# 如果大于等于60小于80,则mark为b
# 如果大于等于80小于90,则mark为c
# 其余情况,mark为d
$mark = ($score < 60) ? "c" : 
        ($score < 80) ? "b" : 
        ($score < 90) ? "a" : 
        "a++";          # 默认值
say $mark;