Perl控制结构

unless

与if相对,当条件为假时执行。

unless ($fred =~ /\A[A-Z_\w*\z]/i){
     do something;
}else{
     do another thing;
}

其实,每一个unless-else结构都可以改写成if-else结构,只要不造成难以理解的程序就好。

until

与while循环相对应,只要条件不为真,就会一直执行。因为条件判断发生在循环第一次迭代之前,所以它可能一次也不执行。

表达式修饰符

为了进一步简化代码的书写,表达式后面可以接一个用于控制它行为的修饰符。

print "$n is a negative number .\n" if $n < 0;
$i *= 2 until $i > $j;
print " ",($n += 2) while $n < 10;
&greet($_) foreach @persons;
print "$fred and $barney\n"
    if $I_am_curious;

任何一种简写都可以改写成传统的写法,使用foreach时,必须使用$_.

裸块控制结构

{
    body;
    body;
    body;
}

裸块不是循环,它只执行循环体一次。 一个关于局部变量的准则是:最好把变量声明在最小使用范围之内。如果某个变量只会在几行代码里使用,可以把这几行写在一个裸块里并就近声明变量。

elsif子句

为什么不是elseif,问Larry去!

自增与自减

  • 前置自增++$n
  • 后置自增$n++

在不提取变量值,而只是利用修改值的副作用的话,那么前置和后置都是一样的。一个常见的用法是配合hash计数:

my @people = qw{ fred barney wilma barney betty fred}
my %seen;
foreach(@people{
    print "I have see you somewhere before,$_!\n"
        if $seen{$_}++;
    }

for循环

三个循环控制部分(初始化,测试,递增)都可以为空。

foreach和for间的秘密关系

其实,对于Perl解析器来说,这两个关键字是等价的,它可以根据圆括号里的内容判断出你的意图,如果有两个分号,则是for,如果没有分号,则是foreach。

循环控制操作符

last

立即终止循环,类似于c里的break。last只能终止本层循环快。

next

立即结束本次循环,但不退出循环。

redo

重新执行本次迭代。

条件操作符?:

expression ? if_true_expr : if_false_expr;

逻辑操作符

逻辑与&& (and),逻辑或||(or)。 逻辑操作符具有短路性质,即对逻辑与来说,如果左边表达式为假,就不会再执行右边的表达式。利用这个性质把会最可能失败或者重要的条件放在左边。

定义或操作符//

my $last_name = $last_name{$someone} // 'no last name';

当左边的值为undef时,采用//右边的默认值,这是一个短路操作符,并且只有当左边为undef时才会跳转到默认值,为0,为空都不会。

使用部分求值操作符的控制结构

&&(and), ||(or), //, ?: 这四个操作符有一个共性,就是根据左边的值决定要不要计算右边的表达式。只要是能激活或者停用某段程序代码的东西都算是控制结构。利用这一点可以写出比较漂亮的程序。

($m < $n ) && ($m = $n);
($m > 10) || print "why is it not greater?\n";

Comments !