perl的控制结构主要有六种,下面我们一一来了解。
0.if () {} else (){} 就不说了啊。
1.while(condition){
do_something;
}
while 循环与C++中的没有什么区别,满足条件就一直执行,否则跳出循环。
不过有时候可以这么用:
my $flag = true;
while ($flag) {
if (condition){
$flag = false;
}
do_something;
}
看个人喜好吧。
2.foreach 与 for 循环。在C++中只有for,但在perl中for与foreach等价,foreach能依次遍历列表的值,比如输出数组中的所有元素,可以这样写:
foreach my $val(@arr) {
print "$val\n";
}
循环会改变列表本身的值,比如@arr,但是不会改变控制变量的值,比如$val。使用for可以像C++中一样,比如依次输出十个数:
for ($i = 1; $i <= 10; $i++){
print "$i\t";
}
使用foreach 可以这样:
foreach (1..10) {
print "$_\t";
}
你会使用哪个呢?其中'1..10'代表从1依次到十,当然,for与foreach其实等价,使用哪个都可以。
大多数时候,使用while 和 foreach 足以完成任务,但是有下面的几个小伙伴的加入,完成任务会更加的有乐趣。
3.unless 控制结构。unless可以看做if 的反面,比如判断打开文件是否成功,可以这样使用if:
if (! open HD,"< file_input") {
die "Can't open.";
}
使用unless ,可以这样:
unless (open HD, "< file_input") {
die "Can't open";
}
当然,有很多不同的方法都可以达到相同的目的,比如第三种:
open HD, "< file_input" or die $!;
怎么样,很简洁吧!其中的or叫做条件修饰符,还可以使用if while 等,这些控制结构如果放在后面就叫条件修饰符,有时候会非常方便,也很省事,毕竟可以不用写{ }了。
4.until 控制结构。if 有一个反面的 unless,那么while理所当然的就有了until控制结构。与while 唯一的差别就是until 在条件为假时一直执行,否则跳出循环。多数情况下个人比较喜欢用while,就不举例子了。
5.裸块控制结构。 所谓裸块控制结构,就是没有多余的东西,只有大括号,像这样的:
{
do_something;
}
在裸块中的语句只执行一次,其中定义的全都是属于局部变量,有时候会很有用。
有了这些控制语句,就像一个人有了骨骼的支撑,更加的健壮,那么如何提早跳出循环或者进入下一次循环呢,接着往下看。
6.循环控制。
a) last.它的作用是立刻终止最近的一个循环,也就是跳出这个循环,接着执行后面的语句。与C++中的break相同。
b) next. 立即结束本次循环,跳过之后的语句,开始下一次循环。与C++中的continue相同。
c) redo. 立即结束本次循环,跳过之后的语句,到达循环的最顶端,相当于从头再次执行这次循环,而不是下一次循环。
d) 标签。上面所说的都只是对最内层的循环就行处理,如果想跳到外层循环,该怎么办?放心,有标签可以使用:
HAHA: while (condition1) {
while (condition2) {
last HAHA if (condition3);
}
}
标签的名字可以随便命名,不过一般采用容易识别的大写字符比较好。
另外,perl中也有自增(++)自减(--)操作符,也分前后,与C++相同,在前面,先加减,再赋值,后面是先赋值,再加减。也有三目操作符? : 。还有逻辑与&&和逻辑或||,所不同的是,逻辑或操作符||的返回值是最后计算的那部分的值,比如:
my $last_name = $last_name{$some} || 'No last name';
如果$some在%last_name中存在,那么就返回$some 对应的值,否则返回右面的值。