流程控制

October 26, 2013 @ 04:55 PM

四个假值

在 Perl 中有 4 种假值:

  1. my $false = undef;
  2. $false = "";
  3. $false = 0;
  4. $false = "0";

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

后缀控制

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

  1. if ($is_frobnitz) {
  2. print "FROBNITZ DETECTED!\n";
  3. }

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

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

whilefor 也可以这样用。

  1. print $i++ . "\n" while $i < 10;

for 循环

for 循环有三种风格。

  1. my @array;
  2. # Old style C for loops
  3. for (my $i = 0; $i < 10; $i++) {
  4. $array[$i] = $i;
  5. }
  6. # Iterating loops
  7. for my $i (@array) {
  8. print "$i\n";
  9. }
  10. # Postfix for loops
  11. print "$_\n" for @array;

你也许会看到 foreach 用于 for 的位置。它们两个可以互换。在上述后两种循环风格中多数人使用 foreach

do 块

do 允许 Perl 在期待语句的位置使用块。

  1. open( my $file, '<', $filename ) or die "Can't open $filename: $!"

但如果你需要做别的事:

  1. open( my $file, '<', $filename ) or do {
  2. close_open_data_source();
  3. die "Aborting: Can't open $filename: $!\n";
  4. };

下列代码也是等价的:

  1. if ($condition) { action(); }
  2. do { action(); } if $condition;

作为特殊情况,while 至少执行块一次。

  1. do { action(); } while action_needed;

Perl 没有 switch 或 case

如果你从其他语言而来,你可能用过 case 语句。Perl 没有它们。

最接近的我们有 elsif

  1. if ($condition_one) {
  2. action_one();
  3. }
  4. elsif ($condition_two) {
  5. action_two();
  6. }
  7. ...
  8. else {
  9. action_n();
  10. }

没有办法像 case 那样清晰。

given … when

从 Perl 5.10.1 开始,你可以使用下列代码来打开实验性的 switch 特性:

  1. use feature "switch";
  2. given ($var) {
  3. when (/^abc/) { $abc = 1 }
  4. when (/^def/) { $def = 1 }
  5. when (/^xyz/) { $xyz = 1 }
  6. default { $nothing = 1 }
  7. }

next/last/continue/redo

考虑以下循环:

  1. $i = 0;
  2. while ( 1 ) {
  3. last if $i > 3;
  4. $i++;
  5. next if $i == 1;
  6. redo if $i == 2;
  7. }
  8. continue {
  9. print "$i\n";
  10. }

输出:

  1. 1
  2. 3
  3. 4

next 跳到块尾并继续或重新开始。

redo 立即跳回到循环的开头。

last 跳到块尾并阻止循环再次执行。

continue 在块尾执行。