Perl笔记:09、其他控制结构
unless控制结构unless控制结构与if控制结构恰恰相反,if是判断表达式为真才执行下面的语句块,unless则判断表达式为假就执行语句块。 如果unless控制结构中加入else子句的时候那就相当于将if...else的代码执行部分反过来写是一致的:
unless
(
$mon
=~
/^Feb/
)
{
print "This month has at least thirty days.n" ; } else { print "Do you see what's going on here?n" ; } 与
if
(
$mon
=~
/^Feb/
)
{
print "Do you see what's going on here?n" ; } else { print "This month has at least thirty days.n" ; } 相同 until控制结构有时也许会想要颠倒while循环的条件。那么可以使用until until($j>$i){ 这个循环回一直执行,直到条件为真。它只不过是个改装过的while循环罢了,两者之前唯一的差别在于until会在条件为假的时候重复执行。 条件修饰词表达式后面可以接着一个用来控制它的修饰词,例如用if修饰词来模拟一个if快:
if
(
$n
<
0
)
{
print "$n is a negative number.n" ; } 除了if修饰词外,还有以下的修饰词: 裸块控制结构所谓的裸快控制结构是没有关键字或条件的代码块。不如现在有一个while循环,如下所示: 裸块还有一个好处,就是可以在裸块里使用临时变量,而不会影响到全局变量。 elsif子句许多情况下,你需要逐项检查一系列的条件表达式,看看其中哪个为真。这可以通过if控制结构的elsif子句来写成如下代码:
if
(
!
defined
$dino
)
{
print "The value 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" ; } 自增和自减很简单与C/C++一致 for控制结构很简单与C/C++一致 循环控制last操作符 操作符last能立即终止循环。就像在C语言中的break操作符一样。当看到last,循环就会结束,例如:
# 输出所有包含 fred的行,直到碰到 __END__ 标记为止
while ( <STDIN> ) { if ( /__END__/ ) { # No more input on or after this marker line last ; } elsif ( /fred/ ) { print ; } } ## last comes here # 只要输入行中有__END__记号,这个循环就会结束。 在Perl中有5中循环块。也就是for、foreach、while、until以及裸块而if块或者子程序带的花括号不是循环的快。last操作符对整个循环块起作用。 last操作符只会对运行中最内层的循环快发挥作用。 next操作符 next是跳过本次循环,像C中的continue一致。 redo操作符 redo操作符可以将控制返回到本次循环的顶端,不经过任何条件测试,也不会进入下一次循环迭代。而那些用过C语言的人们却对这个操作符感到陌生。因为C语言里没有这个概念。例子如下:
# 打字测试
my @words = qw { fred barney pebbles dino wilma betty } ; my $errors = 0 ; foreach ( @words ) { ## redo 会跳到这里 ## print "Type the word '$_': " ; chomp ( my $try = <STDIN> ) ; if ( $try ne $_ ) { print "Sorry - That's not right.nn" ; $errors ++; redo ; # 跳到循环的顶端 } } print "You've completed the test,with $errors errors.n" ; 和另外两个操作符一样,redo在这5中循环快里都可以使用,并且在循环快嵌套的情况下只对最内层的循环起作用。 next和redo两者之前最大的区别在于next会正常继续下一次迭代,而redo则会重新执行这次的迭代。下面的例子可以然你体验这三种操作符工作方式的区别:
foreach
(
1
..10
)
{
print "Iteration number $_.nn" ; 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!nn" ; } print "That's all,folks!n" ; 三目操作符?:perl里的三目操作符和C语言中的一致。 逻辑操作符&& / and 逻辑与
if
(
$dessert
{
'cake'
}
&&
$dessert
{
'ice cream'
}
)
{
# 两个条件都为真 print "Hooray! Cake and ice cream!n" ; } elsif ( $dessert { 'cake' } || $dessert { 'ice cream' } ) { # 至少一个条件为真 print "That's still good...n" ; } else { # 两个都为假——什么也不做 } “定义或”操作符在Perl 5.10中引入了“定义或”操作符//,在发现左边已定义的值时进行短路,无论作弊的只是真是假。这些定义或(defined-or)操作符会跟那些逻辑或操作符一样,只是它们测试的是是否已经定义,而不是布尔值。
use
5.010
;
my $last_name = $last_name { $someone } // '(No last name)' ; 上面的含义为:如果last_name哈希中没有$someon的键时就是用//后面的值作为$last_name的值。 使用部分求值操作符的控制结构 之前看到的四个操作符 &&、 ||、 // 和?: 都有一个共性:根据左边的求值决定是否计算右侧的表达式。有些情况会执行的表达式,在另外的情况下并不执行。因此被统称为部分求值操作符,部分求值操作符是天然的控制结构,因为不会执行所有的表达式。 如果写过linux 下的shell脚本的话应该能够很快的了解这个部分求值操作符的说法,例如在linux 的shell中你可能写过如下的代码: “逻辑或”、“逻辑与”操作符的另外一种写法。可以讲他们写成单词or和and。这种单词的形式和标点符号的形式的效果是相同的,但是前者在运算优先级要低得多。既然单词操作符不会紧紧的粘住附近的表达式,它们需要的括号可能会少一些: 另外一个常用的写法是: open CHAPTER,$filename ====================本章习题===================== 1、编写程序,让用户不断猜测范围从1到100的秘密数字,直到猜中为止。程序应该以公式int(1+rand 100)来随进产生秘密数字。当用户猜错时,程序应该响应Too hight或Too low。如果用户键入quie或exit等字样,或者键入一个空白行,程序终止。当然用户猜到了,程序也终止。
#!/usr/bin/perl -w
use strict ; my $num = int ( 1 + rand 100 ) ; while ( 1 ) { print "please input number:" ; chomp ( my $input = <STDIN> ) ; if ( $input =~ /quit|exit|^s*$/i ) { print "You are a person without perseverance!nbyebye!n" ; last ; } elsif ( $input > $num ) { print "Too hight!n" ; } elsif ( $input < $num ) { print "Too low!n" ; } elsif ( $input == $num ) { print "Ok you are right!n" ; last ; } } 注意:这里的判断退出的语句一定要放到最前面,否则就会出错。该程序中使用了int和rand函数,rand 100 会生成0以上100以下的随机数,但要注意,并非是随机整数,因此有可能为99.999,因此我这里用 1+rand 100来操作,最后利用int函数取出整数部分。 2、修改迁前一个程序,打印额外的调试信息,例如程序选择的秘密数组。确保修改的部分可以用开关控制,并且调试开关即使关上也不会产生警告。如果使用Perl 5.10版本可以用//操作符,否则请使用三目操作符。
my
$debug
=
$ENV
{DEBUG
}
?
$ENV
{DEBUG
}
:
1
;
print "this number is :$numn" if $debug ; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |