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 () {

}

第二个子过程多了一对(),表示这个子过程是没有参数的,而第一个子过程则可以有任意个参数

====

posted on 2011-07-30 23:59  perlman  阅读(507)  评论(0编辑  收藏  举报

导航