1. unless控制结构
在if控制结构中,是当条件表达式为真时,才执行某块代码
可以用unless控制结构,使代码块在条件表达式为假时才执行
unless($fred =~ /\A[A-Z_]\w*\z/i){
print "The value of \$fred doesn't look like a Perl identifier name.\n";
}
if($fred =~ /\A[A-Z_]\w*\z/i){
# 什么也不做
}else{
print "The value of \$fred doesn't look like a Perl identifier name.\n";
}
if(!($fred =~ /\A[A-Z_]\w*\z/i)){
print "The value of \$fred doesn't look like a Perl identifier name.\n";
}
当你看不懂某个unless语句时,可以将它转换成if语句,这么做和运行效率高低无关,2种写法都会被编译成相同的内部字节码
2. 伴随unless的else子句
unless($mon =~ /\AFeb/){
print "This month has at least 30 days.\n";
}else{
print "Do you see what's going on here?\n";
}
if($mon =~ /\AFeb/){
print "Do you see what's going on here?\n";
}else{
print "This month has at least 30 days.\n";
}
咋舒服咋写,看得懂就行
3. until控制结构
颠倒while循环的条件表达式
until($j > $i){
$j *= 2;
}
这个循环会一直执行,直到条件为真。until会在条件为假时重复执行,而且until条件判断发生在循环第一次迭代之前,所以until是一个执行0次以上的循环
4 表达式修饰符
表达式后面可以接一个用于控制它行为的修饰符
print "$n is a negative number.\n" if $n < 0 ;
if( $n < 0 ){
print "$n is a negative number.\n";
}
print this message if $n is less than zero
即使条件表达式写在后面,还是会先执行条件表达式
&error("Invalid input") unless &valid($input);
$i *= 2 until $i > $j;
print " ", ($n += 2) while $n < 10;
&greet($_) foreach @person;
while($n <10){
print " ", ($n += 2);
}
修饰符的常见用法
print "fred is '$fred', barney is '$barney'\n" if $I_am_curious;
print "fred is '$fred', barney is '$barney'\n"
if $I_am_curious;
通常使用这个技巧时,变量会被命名为$TRACING
或者用constant
编译指令来声明一个全局变量
带有修饰符的表达式都可以用块的形式重写,但是由传统写法想带有修饰符的方向改写却未必可以。修饰符2边都只能写单个表达式,所以不能写,某事if某事while某事until某事unless某事foreach某事,另外修饰符的左边也不能放多条语句
在使用foreach修饰符的时候无法自选控制变量,必须得使用$_
5. 裸块控制结构
裸块(naked block),没有关键字或条件表达式的代码
while(condition){
body;
body;
body;
}
拿走关键字while,就会获得1个裸块
{
body;
body;
body;
}
裸块就像1个while或foreach循环体,只是不重复运行,仅执行1次后就结束,所以,裸块不是循环啊!!!!!!!!!!!
通常使用裸块为临时词法变量限定作用域
{
print "Please enter a number: ";
chomp(my $n = <STDIN>);
my $root = sqrt $n;
print "The square root of $n is $root.\n";
}
这个块中的$n
和$root
都是限于局部访问的临时变量
一个关于局部变量的准则是:最好把变量声明在最小使用范围内
如果某个变量只会在几行代码内使用,可以把这几行放到一个裸块里并就近声明变量
6. elsif子句
常常需要逐项检查一系列的条件表达式,看看其中哪个为真,这可以通过if控制结构的elsif子句达成
if( ! defined $dino ){
print "The alue is undef.\n";
}elsif($dino =~ /^-?\d+\.?$/){
print "The value is an integer.\n";
}elsif($dino =~ /^-?\d*\.\d+$/){
print "The value is a _simple_ floating-point number.\n";
}elsif($dino eq ''){
print "The value is the empty string.\n";
}else{
print "The value is the string '$dino'.\n";
}
elsif的子句数量并没有限制,不过perl必须得先执行前面的99个失败的测试,才会到达第100个。如果要写十几个elsif,可以考虑以下用更高效的写法