Perl学习之结构控制(流程控制)

一、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。这些单词操作符和符号操作符的含义相同,但它们(单词操作符)在优先级的底端。由于它们比表达式自身的结合性更低,因此不需要括号。
但最好使用括号。优先级是容易出问题的。除非能明确它们之间的优先级关系,否则最好还是使用括号。单词操作符的优先级非常低,通常可以容易的将这些表达式分成两部分来理解,先分析左侧的,再分析右侧的。

银子曰:有事早奏!无事退朝!

发表评论

验证码: 验证码看不清发泄点这里

 

浏览最多的10篇日志

评论最多的10篇日志

随机显示的10篇日志