Subroutine 子程序 Perl 第四章

子程序的定义是全局的,不需要事先声明。若重复定义子程序,后面的覆盖前面的。

sub marine {

$n +=1;

print " Hello ,sailor number $_ ! ";

}

调用:&marine;

返回值:最后一次的运算结果会被当作返回值。

变量:所有变量默认为全局变量

参数:@_为subroutine 的私有变量。若恰有全局变量@_ 则调用子程序时存起,子程序结束会自动恢复。

         $_[0]  $_[1] $_[2]  ...存于数组变量@_

           sub max {

              if (@_ != 2)  { print  "  “};

                if ($_[0] > $_[1]) {

                    print "  ";

                   }

                }

      &max(13,29) ;

example2:

      $maxmun = &maxh(2,8,32,44,9);

     sub maxh { 

        my ($max_so_far) = shift @_ ;

       foreach (@_)  {

         if ($_ > $max_so_far)  { $max_so_far = $_ };

        }

      $max_so_far;

  }

私有变量: my

 sub max {

  my ($m,$n) = @_ ;  #子程序私有变量;和子程序外的世界互不相犯

  }

作用域受限于定义它的最内层语句块/文件 #语句块为foreach等。

my 操作不会改变赋值时的上下文

my  ($num)  = @_  ;  # 列表上下文  等同于  ($num) = @_

my  $num = @_ ; #标量上下文  等同于  $num = @_

my $fred,$baney  # 错,没有声明$baney

return:立即停止执行,并返回某值。

        sub which {

         foreach (  )  {         

         if  ( )  {

                     return  $_;

              }

         }

       return -1 ;  #或省略return   指查无此值,没有找到符合条件的元素

    }

省略&号:

和内嵌函数同名时,不能省略&。  比如自定义一个函数chomp() ,调用时必须使用&chomp

非标量返回值:

sub  listx  {

if ($a < $b) {

  $a..$b

} else {

reverse $a..$b

}

@c = &listx(11,6)  ;#  11,10,9,8,7,6

持久性私有变量:state  多次调用子程序期间,保留该变量每次的值。适用于未定义的全局变量这种情况,my私有变量每次调用结束,就会抛弃存值。

原文地址:https://www.cnblogs.com/lelin/p/11206190.html