1、声明一个命名子过程,但不定义:
sub NAME
sub NAME PROTO
sub NAME ATTRS
sub NAME PROTO ATTRS
如果要定义一个子过程,只要在上面加上一个BLOCK就可以了
sub NAME PROTO ATTRS BLOCK
PROTO和ATTRS表示原型和属性,相对于NAME和BLOCK不重要,NAME和BLOCK是基本部分,其他的可以省略。
2、没有NAME的形式也是可以的 ,你必须提供一个调用子过程的方法。因此你必须保存返回值,因为这种形式的sub声明方法不但在编译的时候编译,同时也产生一个运行时的返回值,所以我们就可以保证保存它:
$subref = sub BLOCK;
也可以用下面的方法引入在另一个模块中定义的子过程:
use MODULE qw (NAME1 NAME2 NAME3…);
3、直接调用子过程的方法
NAME(LIST) #有圆括弧时,&是可选的
NAME LIST #如果预声明/输入了子过程,那么圆括弧是可选的
&NAME #把当前的@_输出到子过程,并且绕开原型
4、间接调用子过程,(通过名字或引用),可以使用下面的任何一种方法:
&$subref(LIST) #在间接调用的时候,&不能省略
$subref->(LIST) #
&¥subref #把当前的@_输出到该子过程
#:在正式的情况下,一个子过程的名字包括&前缀,但是通常情况下&是可选的;
#:如果预先定义了子过程,那么圆括弧是可选的;
#:在只使用子过程的名字的时候,&不能省略;
例如:1)子过程名字被用作一个参数来判断是否已经定义过;
2)用$subref = \&name来获取一个命名子过程的引用的时候;
3)$subref->(),则不需要&;