Perl 条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块;
可以通过下图来简单了解条件语句的执行过程:
注意,数字 0, 字符串 '0' 、 "" , 空 list () , 和 undef 为 false ,其他值均为 true; true 前面使用 ! 或 not则返回 false ;
三元运算符 ? :
我们可以使用 条件运算 ? : 来简化 if...else 语句的操作,通常格式为:
Exp1 ? Exp2 : Exp3;
如果 Exp1 表达式为 true ,则返回 Exp2 表达式计算结果,否则返回 Exp3;实例如下所示:
if 语句
#!/usr/bin/perl
$a = 10;
# 使用 if 语句判断布尔表达式
if( $a < 20 ){
# 布尔表达式为true时执行
printf "a 小于 20\n";
}
print "a 的值为 : $a\n";
$a = "";
# 使用 if 语句判断布尔表达式
if( $a ){
# i布尔表达式为true时执行
printf "变量 a 为 true\n";
}
print "a 的值为 : $a\n";
执行以上程序,输出结果为:
a 小于 20
a 的值为 : 10
a 的值为 :
注意,perl中,即使{}中的statement只有一条,{}也不能省略,这一点与C语言不同;当{}中只有一条语句时,perl提供了一种简便写法:statement if(),如下面的例子:
if...else 语句
语法格式如下所示:
if(boolean_expression){
# 在布尔表达式 boolean_expression 为 true 执行
}else{
# 在布尔表达式 boolean_expression 为 false 执行
}
#!/usr/bin/perl
$a = 100;
# 使用 if 语句判断布尔表达式
if( $a < 20 ){
# 布尔表达式为true时执行
printf "a 小于 20\n";
}else{
# 布尔表达式为false时执行
printf "a 大于 20\n";
}
print "a 的值为 : $a\n";
$a = "";
# 使用 if 语句判断布尔表达式
if( $a ){
# 布尔表达式为true时执行
printf "a 条件为 true\n";
}else{
# 布尔表达式为false时执行
printf "a 条件为 false\n";
}
print "a 的值为 : $a\n";
执行以上程序,输出结果为:
a 大于 20
a 的值为 : 100
a 条件为 false
a 的值为 :
if...elsif...else 语句
在使用 if , elsif , else 语句时你需要注意以下几点。
-
if 语句后可以跟上 0 个 或 1 个 else 语句,但是 elsif 后面必须有 else 语句
-
if 语句后可以跟上 0 个 或 1 个 elsif 语句,但它们必须写在 else 语句前
-
如果其中的一个 elsif 执行成功,其他的 elsif 和 else 将不再被执行
语法格式如下所示:
if(boolean_expression 1){
# 在布尔表达式 boolean_expression 1 为 true 执行
}
elsif( boolean_expression 2){
# 在布尔表达式 boolean_expression 2 为 true 执行
}
elsif( boolean_expression 3){
# 在布尔表达式 boolean_expression 3 为 true 执行
}
else{
# 布尔表达式的条件都为 false 时执行
}
unless 语句
语法格式如下所示:
unless(boolean_expression){
# 在布尔表达式 boolean_expression 为 false 执行
}
#!/usr/bin/perl
$a = 20;
# 使用 unless 语句检测布尔表达式
unless( $a < 20 ){
# 布尔表达式为 false 时执行
printf "a 大于等于 20\n";
}
print "a 的值为 : $a\n";
$a = "";
# 使用 unless 语句检测布尔表达式
unless ( $a ){
# 布尔表达式为 false 时执行
printf "条件 a 为 false\n";
}
print "a 的值为 : $a\n";
执行以上程序,输出结果为:
a 大于等于 20
a 的值为 : 20
条件 a 为 false
a 的值为 :
unless...else 语句
语法格式如下所示:
unless(boolean_expression){
# 在布尔表达式 boolean_expression 为 false 执行
}else{
# 在布尔表达式 boolean_expression 为 true 执行
}
#!/usr/bin/perl
$a = 100;
# 使用 unless 语句检测布尔表达式
unless( $a == 20 ){
# 布尔表达式为 false 时执行
printf "给定的条件为 false\n";
}else{
# 布尔表达式为 true 时执行
printf "给定的条件为 true\n";
}
print "a 的值为 : $a\n";
$a = "";
# 使用 unless 语句检测布尔表达式
unless( $a ){
# 布尔表达式为 false 时执行
printf "a 给定的条件为 false\n";
}else{
# 布尔表达式为 true 时执行
printf "a 给定的条件为 true\n";
}
print "a 的值为 : $a\n";
执行以上程序,输出结果为:
给定的条件为 false
a 的值为 : 100
a 给定的条件为 false
a 的值为 :
unless...elsif..else statement
在使用 unless , elsif , else 语句时你需要注意以下几点。
-
unless 语句后可以跟上 0 个 或 1 个 else 语句,但是 elsif 后面必须有 else 语句
-
unless 语句后可以跟上 0 个 或 1 个 elsif 语句,但它们必须写在 else 语句前
-
如果其中的一个 elsif 执行成功,其他的 elsif 和 else 将不再被执行
语法格式如下所示:
unless(boolean_expression 1){
# 在布尔表达式 boolean_expression 1 为 false 执行
}
elsif( boolean_expression 2){
# 在布尔表达式 boolean_expression 2 为 true 执行
}
elsif( boolean_expression 3){
# 在布尔表达式 boolean_expression 3 为 true 执行
}
else{
# 没有条件匹配时执行
}
#!/usr/bin/perl
$a = 20;
# 使用 unless 语句检测布尔表达式
unless( $a == 30 ){
# 布尔表达式为 false 时执行
printf "a 的值不为 30\n";
}elsif( $a == 30 ){
# 布尔表达式为 true 时执行
printf "a 的值为 30\n";
}else{
# 没有条件匹配时执行
printf "a 的 值为 $a\n";
}
执行以上程序,输出结果为:
a 的值不为 30
switch 语句
语法格式如下所示:
use Switch;
switch(argument){
case 1 { print "数字 1" }
case "a" { print "字符串 a" }
case [1..10,42] { print "数字在列表中" }
case (\@array) { print "数字在数组中" }
case /\w+/ { print "正则匹配模式" }
case qr/\w+/ { print "正则匹配模式" }
case (\%hash) { print "哈希" }
case (\&sub) { print "子进程" }
else { print "不匹配之前的条件" }
}
以下是 switch 语句的规则:
- switch 语句的括号中可以使用任意类型的标量参数。
-
在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。
-
case 语句后的标量会与 switch 语句的标量进行比较,判断是否相等。
-
当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。
-
switch 语句可以有一个可选的 else ,该语句在最后面,该语句在所有 case 不匹配的情况下执行。
-
当匹配 case 后,会执行 case 语句块代码,执行后跳出 switch 语句。
#!/usr/bin/perl
use Switch;
$var = 10;
@array = (10, 20, 30);
%hash = ('key1' => 10, 'key2' => 20);
switch($var){
case 10 { print "数字 10\n" }
case "a" { print "字符串 a" }
case [1..10,42] { print "数字在列表中" }
case (\@array) { print "数字在数组中" }
case (\%hash) { print "在哈希中" }
else { print "没有匹配的条件" }
}
执行以上程序,输出结果为:
数字 10
given/when
perl5中不推荐使用switch-case 语句,而使用·使用given/when
代替:
given (argument) {
when (condition) { statement(s); }
when (condition) { statement(s); }
when (condition) { statement(s); }
.
.
.
default { statement(s); }
}