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 !