Perl学习之结构控制(流程控制)(0 位领导批示)
- 2008-06-6
- 分类:Perl
- 作者:银子
- 2,277 位领导视察
一、if else 控制结构
一旦能比较两个值时,就希望能根据这些比较结果作判断。和别的语言类似,Perl中也提供了if控制结构。
如果需要另一种选择,可以使用关键字else。
NOTE:花括号是必须的(这一点和C,php不同)。
二、while 控制结构
while 语句可以循环执行其内部的一块代码直到其条件非真。
条件中真假值的判断和if结构中是一样的。和if控制结构相同,花括号是必须的。判断条件在迭代前执行,如果条件为假,则一次也不执行。
三、foreach 控制结构
foreach 从列表(数组)的第一个元素一直循环执行到最后一个元素,一次迭代一个。
foreach $list (qw/一 二 三/)
{
print "$list\n";
}
foreach 控制变量每一次迭代从列表中取出一个新值。
四、unless 控制结构
在if控制结构中,只有条件为真时,才执行块中的代码。如果你想在条件为假时执行,可以使用unless。
unless的含义是:除非条件为真,否则执行块中的代码。这和在if语句的条件表达式前面加上!(取反)所得结果是一样的。另一种观点是,可以认为它自身含有else语句。如果不太明白unless语句,你可以把它用if语句来重写。重写后的效率不会变化,它们会被编译成相同的内部字节码。
1.unless 和 else 语句一起使用
unless中也可以有else语句。虽然语法上支持,但可能引起混淆(不推荐使用)。
五、until 控制结构
有时,希望将 while 循环的条件部分取反。此时可以使用until。
my $j = 1;
my $i = 10;
until($j > $i)
{
$j *=2;
}
print $j;#返回16,很奇怪吧
这个循环一直执行,直到条件表达式的返回值为真为止。它和while循环非常类似,只是在条件为假时重复执行,而不是在条件为真的情况下执行。条件表达式在第一次迭代前即会被求值,因此这是0次或多次的循环,和while循环一样。同if和unless一样,将条件部分取反,即可将until循环写成同while循环一样。
六、表达式修饰符
为了得到更紧凑的形式,表达式后可以紧接控制修饰语。如,if修饰语可以像if块那样使用:
my $n = 1; print "银子第 $n 次测试\n" if $n>0;
这样可以省略括号和花括号。
条件表达式也是先被求值的,虽然被放在后面。这和通常的的从左到右的顺序相反。要理解Perl代码,应当像Perl内部的编译器那样,将整个语句读完,来其具体的含义。
一个明显的例子:
while ($n < 10)
{
print "", ($n += 2); #返回246810
}
它将2加给$n,再将结果传给$n。然后这个值被输出。
NOTE:只有单个表达式才允许按这两种方式书写。并且也不能在修饰语左端使用多条语句。如果在修饰语两端需要使用多行语句,那按照老方法来写,使用括号和花括号。
七、The Naked Block 控制结构
被称为 裸块 是指没有关键字或条件的块。
裸块 看起来像while或foreach循环,除了它不循环外。它执行 循环体 一次,然后结束。
一个例子:
{
print "输入一个整数:";
chomp(my $n = <STDIN>);
my $root = sqrt $n; #计算平方根
print "$n 的平方根是 $root.\n";
}
八、elsif 语句
很可能需要检测一连串的条件表达式,一个接一个,来判断哪一个是真。这可以在if控制结构中使用elseif语句做到。
Perl会依次检测条件表达式。当某个成功时,相应的代码即被执行,整个控制结构也就结束了,然后转到后面执行。如果没有成功,则else代码块被执行。
NOTE:Perl没有像C语言 switch 结构中的 fall-through(直接跳入) 下一个代码块的功能。这也是与PHP等语方的区别。
NOTE:关键字 elsif 只有一个e。如果写成 elseif ,Perl会提示拼写错误。
九、自增和自减
常常需要一个标量变量可以自动增1,或者减1。由于这种操作很平常,因此同其它操作频繁的表达式一样,Perl也提供了两种简写形式。
自增运算符(++)会使标量变量自动加1。
将++放在变量前,先将此变量增1,再取其值。这是前置++。
自减运算符(–)会使标量变量的值减1。
将–放在变量前,再取其值。这是前置–。
NOTE:如果表达式单独出现,只是利用其改变值的特点,则将操作符(++,–)放在前面或者后面是没有区别的。
十、for 控制结构
Perl的for控制结构和其它语言中的for控制结构类似。
for循环的最常用用法是,进行重复的运算:
for($i=1; $i<=10; $i++)
{
print "$i\n";
}
十一、循环控制
Perl是一种 structrued(结构) 程序语言。每一个代码块均有一个入口,即是块的顶端。但有时需要对它进行更多的控制。例如,你可能希望写一个至少执行一次的while循环。或者希望能更早从代码中退出。Perl提供了三种循环控制的操作,可在循环块中起到某些作用。
1.last 操作
last会立刻结束循环。当循环块执行到last,循环即结束。
Perl的5种循环体分别是for, foreach, while, until,以及 裸块。花括号括起来的if块,子程序不算。last对上述循环块有作用。
2.next 操作
有时还不希望结束循环,但本次循环已经结束。这种情况下,next是非常适用的。它跳到当前循环块的最后面。next之后,又会进入下一轮循环(这和C或者类似语言的 continue 相似)。
例子:
while(<>)
{
foreach(split)
{
#将$_分拆成单词,并依次赋给$_
$total++;
next if/\W/; #不是"words"的被跳过
$valid++;
$count{$_}++; #对每个单词进行计数
##next 跳到这里##
}
print "总数 = $total, 有效文本 = $valid\n";
foreach $word (sort keys %count)
{
print "$word => $count{$word}\n";
}
}
3.redo 操作
循环控制的第三个操作是redo。它会跳到当前循环块的顶端,不进行条件表达式判断以及接着本次循环。
next和redo的最大区别在于,next会进入下一次循环,而redo会继续执行本次循环。
一个能区分last,next与redo的例子:
foreach(1..10)
{
print "操作到第:$_ 步\n\n";
print "请选择: last, next, redo, 也可以留空 ";
chomp(my $choice = <STDIN>);
print "\n";
last if $choice =~ /last/i;
next if $choice =~ /next/i;
redo if $choice =~ /redo/i;
print "测试\n\n";
}
print "跳出循环\n";
4.标签块
如果要从最内层的循环中跳出来,可以使用标签(label)。标签在Perl中就像一般标识符一样:由字母,数字,下划线组成,但不能由数字开头。由于没有前缀字符,标签可能和内嵌的函数名,或者你自己的子程序名混淆,所以推荐标签均为大写。
十二、逻辑操作符
Perl含有所有必须的逻辑操作符来处理Boolean(true/false)值。例如,进行逻辑判断的逻辑与AND(&&)和逻辑或OR(||)。
1.短路操作的值
短路操作的结果是最后被执行语句的返回值,而非仅仅是一个Boolean值。如果最后被执行的部分为真,则整个为真;为假,则整个为假。
2.三元操作符
三元操作有些像if-then-else一样,不过是在一个表达式之中。被称作三元操作符是因为它有三个操作数,看起来如下:
Express ? if_true_expr : if_false_expr
3.使用部分求值的操作符
前面三个操作符&&, || , ?:,均有一个共同的特殊性质:根据左侧的值(true 或false),来判断是否执行右侧代码。有时会被执行,有时不会。由于这个理由,这些操作符有时叫做部分求值(partial-evaluation)操作符,因为有时并非所有的表达式均被执行。部分求值操作符是自动的控制结构。
还有一种书写逻辑与(AND)与逻辑或(OR)的方法。可以使用单词:and 与or。这些单词操作符和符号操作符的含义相同,但它们(单词操作符)在优先级的底端。由于它们比表达式自身的结合性更低,因此不需要括号。
但最好使用括号。优先级是容易出问题的。除非能明确它们之间的优先级关系,否则最好还是使用括号。单词操作符的优先级非常低,通常可以容易的将这些表达式分成两部分来理解,先分析左侧的,再分析右侧的。
NOTE:本博内容大部分为原创,转载请注明出处。
永久链接:http://www.zdyi.com/perl-configuration-control/99

























银子曰:还没有领导题词?
请领导指示
Additional comments powered by BackType