chj0771 发表于 2015-12-28 02:46:14

perl语言编程第六章-子过程

子过程声明
  sub NAME ;

子过程定义
  sub NAME
  {
  。。。
  }

匿名子过程
  声明的时候没有名字,只有sub关键字加代码块。这种写法实在蛋疼,不知道有何好处?下面代码中subref是指向这个匿名子过程的引用。



use strict ;
my$subref=sub{
    my ($a,$b) =@_ ;
    return$a+$b ;
} ;
print$subref->(1,2),"\n" ;
  通过use关键字引入另一个模块中的子过程。



use qw(name1, name2, name3) ;
子过程的调用

直接调用
  NAME(LIST) #有圆括弧时,&可以省略。
  NAME LIST 如果预声明/输入了子过程,那么圆括弧是可选的?那么具体什么时候不能省略圆括弧么?
  &NAME 把当前@_内容作为子过程参数。

间接调用
  &$subref(LIST) #间接调用的时候&不能省略。
  $subref->(LIST)。
  &$subref 把当前@_内容作为子过程参数。

子过程命名风格
  自定义的子过程一般采用全小写字母命名,因为perl中大写的子过程都是自动调用的,比如析构函数DESTROY。

子过程的设计理念
  perl的子过程定义体现了一个理念,那就是支持可变参数。所以通常定义的子过程并为指定参数,当然可以使用原型方法来提供。

返回值
  可以使用return语句来返回不同的值,如果仅有return语句,后面没有值,那么返回undef或者空列表(视上下文而定)



sub test{
    return ; # return undef or empty list
}
  传入引用
  下面这个程序使用数组引用做参数,有些地方我还不是很明白,需要深入研究



use strict ;
sub sum{
    my ($aref) =@_ ;
    my$total=undef ;
    foreach (@$aref){
      $total+=$_ ;
    }
    return$total ;
}
my@list= (1..100000) ;
my$result=&sum(\@list) ;
print$result,"\n" ;
1 ;
  无参子过程
  下面两个子过程完全不同



sub test {
}
sub test () {
}
  第二个子过程多了一对(),表示这个子过程是没有参数的,而第一个子过程则可以有任意个参数
  ====
页: [1]
查看完整版本: perl语言编程第六章-子过程