Perl-其他控制结构1

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,可以考虑以下用更高效的写法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值