Perl中的控制结构

来源:岁月联盟 编辑:zhu 时间:2009-03-05

  先来看看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程序了,高兴啊,关于程序控制方面的东西以后会一步步补全的。