流程控制
最后更新于:2022-04-01 21:07:14
## 四个假值
在 Perl 中有 4 种假值:
~~~
my $false = undef;
$false = "";
$false = 0;
$false = "0";
~~~
最后一个为假值是因为 `"0"` 在数字上下文中将变成 0,根据第三条规则, 它是假值。
## 后缀控制
简单的 `if` 或 `unless` 块可能看起来像这样:
~~~
if ($is_frobnitz) {
print "FROBNITZ DETECTED!\n";
}
~~~
在这些情况下,`if` 或 `unless` 能够追加到简单语句的尾部。
~~~
print "FROBNITZ DETECTED!\n" if $is_frobnitz;
die "BAILING ON FROBNITZ!\n" unless $deal_with_frobnitz;
~~~
`while` 和 `for` 也可以这样用。
~~~
print $i++ . "\n" while $i < 10;
~~~
## `for` 循环
`for` 循环有三种风格。
~~~
my @array;
# Old style C for loops
for (my $i = 0; $i < 10; $i++) {
$array[$i] = $i;
}
# Iterating loops
for my $i (@array) {
print "$i\n";
}
# Postfix for loops
print "$_\n" for @array;
~~~
你也许会看到 `foreach` 用于 `for` 的位置。它们两个可以互换。在上述后 两种循环风格中多数人使用 `foreach`。
## `do` 块
`do` 允许 Perl 在期待语句的位置使用块。
~~~
open( my $file, '<', $filename ) or die "Can't open $filename: $!"
~~~
但如果你需要做别的事:
~~~
open( my $file, '<', $filename ) or do {
close_open_data_source();
die "Aborting: Can't open $filename: $!\n";
};
~~~
下列代码也是等价的:
~~~
if ($condition) { action(); }
do { action(); } if $condition;
~~~
作为特殊情况,`while` 至少执行块一次。
~~~
do { action(); } while action_needed;
~~~
## Perl 没有 `switch` 或 `case`
如果你从其他语言而来,你可能用过 `case` 语句。Perl 没有它们。
最接近的我们有 `elsif`:
~~~
if ($condition_one) {
action_one();
}
elsif ($condition_two) {
action_two();
}
...
else {
action_n();
}
~~~
没有办法像 `case` 那样清晰。
## `given ... when`
从 Perl 5.10.1 开始,你可以使用下列代码来打开实验性的 `switch` 特性:
~~~
use feature "switch";
given ($var) {
when (/^abc/) { $abc = 1 }
when (/^def/) { $def = 1 }
when (/^xyz/) { $xyz = 1 }
default { $nothing = 1 }
}
~~~
## `next/last/continue/redo`
考虑以下循环:
~~~
$i = 0;
while ( 1 ) {
last if $i > 3;
$i++;
next if $i == 1;
redo if $i == 2;
}
continue {
print "$i\n";
}
~~~
输出:
~~~
1
3
4
~~~
`next` 跳到块尾并继续或重新开始。
`redo` 立即跳回到循环的开头。
`last` 跳到块尾并阻止循环再次执行。
`continue` 在块尾执行。
';