Perl中的控制结构
先来看看Perl中的循环结构吧。
1:while结构
while结构在perl中有三种形式。 第一种形式是这样的:
#!/user/bin/perl -w
use strict;
{
my $a=0;
while(3>$a)
{
print $a ;
print " ";
}
}
第二种是定语后置式。呵呵,英文好的觉得很正常了。
#!/user/bin/perl -w
use strict;
{
my $a=0;
print $a ." " while(3>$a);
}
第三种是这个样子的,很古怪,真的很古怪。这种用法就是加上一个continue:
#!/user/bin/perl -w
use strict;
{
my $a=0;
while(3>$a)
{
print "$a ";
}
continue
{
if($a >1) print "hello ";
}
}
这种结构会在每个while运行了一圈之后运行一遍continue的部分,然后继续进行while循环。
2:for结构
for结构是各种语言中都有的。perl中的for结构和c语言中的非常相近。下面是一个例子。
#!/user/bin/perl -w
use strict;
{
my $a;
for($a=0;$a<10;$a )
{
print "$a ";
}
}
对于数组我们可以这样访问。
#!/user/bin/perl -w
use strict;
{
my @a=(1..10);
my $counter;
for($counter=0;$counter<@a;$counter )
{
print "$a[$counter] ";
}
}
这里面出现了一句$counter<@a,记住,数组在标量情况下即@a返回的是数组的长度,这样就好懂了,是不是?
3:foreach控制结构
foreach控制结构很好玩的,在bsh和javascript中有一种for(in)循环和foreach很相象。其他的语言我不熟悉,不知道有没有相近的。foreach的用法可以从下面的例子得知:
#!/user/bin/perl -w
use strict;
{
my @a=(1..10);
my $counter;
foreach $counter (@a)
{
print "$counter ";
}
}
这个程序将会把@a数组中所有的元素先逐个引用给$counter,然后把$counter地值打印出来。注意,我这里说得是引用,不是赋值,perl里面的“=”实际上是在进行引用,而不是赋值,这是需要同c严格区分的。下面的例子更加好玩一点,看一看:
#!/user/bin/perl -w
use strict;
{
my @a=(1..10);
my $counter;
foreach $counter (@a)
{
$counter ;
}
print "@a ";
}
猜一猜将会打印出什么?呵呵,是234567891011。因为,$counter是@a中每个元素的引用,所以$counter 就对@a中每个元素进行了 操作。foreach用在hash中是非常爽的。
#!/user/bin/perl -w
use strict;
{
my %a=(hello,"你好",great,"太棒了");
my $thiskey;
foreach $thiskey (keys %a)
{
print "$thiskey=>$a($thiskey) ";
}
}
将可以把hash中所有的key和value打印出来。呵呵,很好玩吧?
一种编程语言中的控制结构是控制程序流程走向的语句和语法,今天先来学学最基本的三个控制If、Unless、Until,呵呵,其实跟其他编程语言中的对应语句的用法没有大的区别,我们就通过几个例子来看一看吧。
if是各种语言中都有的结构,但是perl的if似乎有点……那个,可称之为“定语后置”。 具体来说就是这个样子的
#!/usr/bin/perl -w
use strict;
{
my $a=3;
print "thank god!" if($a==3);
}
当然这是一个很无聊的程序了,但给大家演示了perl中定语是如何后置的。其他地方if的用法同其他语言就没什么区别了。又例如下面的例子
#!/usr/bin/perl -w
use strict;
{
my $a;
for($a=0;$a<10;$a )
{
if($a>5) print "haha ";
}
}
有了if就一定会有else,else也没有什么特别的。用法如下:
#!/usr/bin/perl -w
use strict;
{
my $a;
for($a=0;$a<10;$a )
{
if($a>5) print "haha ";
else print "lala ";
}
}
perl里面有一个特别的控制语句叫做“elsif”的,注意,不是“elseif”,而是“elsif”,这个语句的作用同else if是一样的。使用可以看下面的例子。
#!/usr/bin/perl -w
use strict;
{
my $a;
for($a=0;$a<10;$a )
{
if($a>5) print "haha ";
elsif($a>3) print "lala ";
else print "gee! ";
}
}
Unless是If的反义词,这个关键字的用法和if完全一样,但是相当于加上一个!(取非),用一个例子来说:
#!/usr/bin/perl -w
use strict;
{
my $a;
for($a=0;$a<0;$a )
{
print "$a " if(!$a>5);
}
}
和
#!/usr/bin/perl -w
use strict;
{
my $a;
for($a=0;$a<0;$a )
{
print "$a " unless($a>5);
}
}
是一样的。 我一直不太明白这个关键字有什么用。
Until是While的反义词,就是说不执行后面的语句一直到满足条件为止。如下面的例子
#!/usr/bin/perl -w
use strict;
{
my $a;
for($a=0;$a<0;$a )
{
until($a==3)
{ print "$a " unless($a>5);
$a ;
}
}
}
这一段程序打印出3,好像很无聊是吧?但是有时候会有用的。这里有一个需要注意的是在until 里面有一个$a 。没有这个就会……555,死循环了。
今天继续剩余的程序流程控制,有next、last、redo这么几个语句。next相当于c语言中的continue,就是中止本次循环的过程,开始下一次循环。我们可以参照下面 的例子来理解它:
#!/usr/bin/perl -w
use strict;
{
my $x;
for($x=0;$x<10;$x )
{
if($x==3)
{ next;}
print "$x ";
}
}
会打印出0 1 2 4 5 6 7 8 9,当到了3的时候就next了,呵呵。next还可以和标号结合使用退出某一层循环。如下面的例子。
#!/usr/bin/perl -w
use strict;
{
my $x;
my $y;
here: # here是一个标号
for($x=0;$x<5;$x )
{
for($y=1;$y<3;$y )
{ if($x==3)
{ next here; }
print "$x ";
}
print " ";
}
}
将会打印 0 0 1 1 2 2 4 4,到3的时候跳过标有here标号的循环。
last相当于c语言中的break,就是跳出循环。例如下面的代码:
#!/usr/bin/perl -w
use strict;
{ my $x;
for($x=0;$x<10;$x )
{
last if($x==3);
print "$x ";
}
}
将会打印0 1 2。当$x增加到3的时候就退出了。last同next一样也具有标号的功能。例如下面的代码:
#!/usr/bin/perl -w
use strict;
{
my $x;
my $y;
there:
for($x=0;$x<10;$x )
{
for($y=0;$y<3;$y )
{
last if($x==3);
print("$x ");
}
print(" ");
}
}
会打印出 0 0 0 1 1 1 2 2 2,这里当$x==3的条件满足时,就会跳出标有there的循环。
redo是一个很好玩的东西,这个家伙居然会让当前的一圈循环重新进行一次。但是我到现在都没有发现这个东西有什么用。下面的例子说明了redo的用法。
#!/usr/bin/perl -w
use strict;
{
my $x;
for($x=0;$x<5;)
{
$x ;
redo if($x==4);
print "$x ";
}
}
会打印1 2 3 5,呵呵,这个结果是很有趣的啊。当$x==3的时候,$x 结果是4,然后发生了redo,结果4就没打印出来。然后下一次循环开始了。这个时候又发生了一次$x ; 结果$x变成5了,然后打印出来。然后条件检测不通过,退出循环。
如果把上面的循环改成
for($x=0;$x<5;$x )
{
redo if($x==4);
print "$x ";
}
则在我的机器上面发生了死循环,呵呵。 明天我们就开始使用cgi模块写cgi程序了,高兴啊,关于程序控制方面的东西以后会一步步补全的。