流程控制
October 26, 2013 @ 04:55 PM
四个假值
在 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
在块尾执行。