- 表达式修饰符
为了进一步简化代码书写,表达式后边可以接一个用于控制它行为的修饰符。
- if修饰符
print "$n is a negative number.\n" if $n <0;
即使表达式修饰符写在后边,它任然会先执行。
- 其他修饰符
&report("something wrong") unless &okok($input);
$i *= 2 until $i > $j;
print "---", ($n+=2) while $n < 10;
$invoke($_) foreach @babala;
- 代码块
{… }可以为局部变量提供作用域。
- 梯形选择结构
if(...){
}elsif(...){
}elsif(...){
}else{
}
- 自增/自减
perl支持 $i++,$i--
等形式。
- for循环
for($i=1; $i<=10; $i++){
...
}
for(1..10){
print "I can count to $_!\n";
}
- 循环控制命令
- last
类似break。
last在for,foreach,while,until中都可以用。在循环嵌套的情况下只对最内层循环起作用。 - next
类似continue,可以结合表达式修饰符。
next if /\W/;
next在for,foreach,while,until中都可以用。在循环嵌套的情况下只对最内层循环起作用。
- redo
将控制返回到当前循环块的顶部,而不经过任何循环测试,也不会进入下一次循环迭代。
来个例子
注意:对于<STDIN>的错误输入,在修改时退格键(Backspace)也会被当成字符送入输入缓冲区,从而无法删除错误的字符。这时可以使用 “ Ctrl + Backspace ”来删除错误字符。
#!/usr/bin/perl
use utf8;
#打字测验
my @words=qw{ apple bread pear banana rudimentary renaissance };
my $errors=0;
foreach(@words){
## redo 会跳到这里 ##
print "Type the word '$_': ";
chomp(my $try=<STDIN>);
if($try ne $_){
print "Sorry That's not right.\n\n";
$errors++;
redo; #跳回循环顶端
}
}
print "You've completed the test, with $errors errors.\n";
redo在for,foreach,while,until中都可以用。在循环嵌套的情况下只对最内层循环起作用。
next和redo的区别在于:
next会正常继续下一次迭代,而redo则会重新执行这次迭代。
#!/usr/bin/perl
foreach(1..10){
print "Iteration number $_.\n\n";
print "Please choose: last, next, redo, or none of the above?";
chomp(my $choice=<STDIN>);
print "\n";
last if $choice =~ /last/i;
next if $choice =~ /next/i;
redo if $choice =~ /redo/i;
print "That wasn't any of the choices... onward!\n\n";
print "That's all, folks!\n";
}
- 条件运算符
语法
my $location=&is_weekend($day) ? "home" : "work";
- 逻辑操作符
运算符 | 说明 |
---|---|
&& | AND |
││ | OR |
满足“短路特性”。
“ // ”运算符
在发现左边的值属于已定义时进行短路操作,而不管该值属于逻辑真还是逻辑假。
有时要给一个未定义变量(undef)赋值,若已定义就保留原值。
my $Verbose=$ENV{VERBOSE} // 1;
print "I can talk to you!\n" if $Verbose;
再来一个例子
#!/usr/bin/perl
foreach my $try(0, undef, '0', 1, 25){
print "Trying [$try] ---> ";
my $value = $try // 'default';
print "\tgot [$value]\n";
}