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 () { }
第二个子过程多了一对(),表示这个子过程是没有参数的,而第一个子过程则可以有任意个参数
====