流程控制

优质
小牛编辑
122浏览
2023-12-01

四个假值

在 Perl 中有 4 种假值:

my  $false = undef;
    $false = "";
    $false = 0;
    $false = "0";

最后一个为假值是因为 "0" 在数字上下文中将变成 0,根据第三条规则, 它是假值。

后缀控制

简单的 ifunless 块可能看起来像这样:

if ($is_frobnitz) {
    print "FROBNITZ DETECTED!\n";
}

在这些情况下,ifunless 能够追加到简单语句的尾部。

print "FROBNITZ DETECTED!\n" if $is_frobnitz;
die "BAILING ON FROBNITZ!\n" unless $deal_with_frobnitz;

whilefor 也可以这样用。

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 没有 switchcase

如果你从其他语言而来,你可能用过 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 在块尾执行。