Perl-13---子程序-1

一、子程序的概念:

子程序就是函数,是一段执行特殊任务的分离的代码,使用子程序可以提高代码的复用度;从使用的角度来分,可以把子程序分为四种:系统函数、用户子定义函数、有参函数、无参函数;

Perl的子程序可以出现在程序中的任何地方;子程序的声明使用关键字sub来做;声明无参函数和有参函数的语法如下:

sub  子程序名;

sub  子程序名(参数列表);

只有声明而没有定义的子程序可以用于列表;定义子程序就是在子程序的声明后面加上一段代码块;无参函数和有参函数的定义如下:

sub  子程序名

{

    #The body of this function

}

sub  子程序名(参数列表)

{

    #The body of this function

}

也可以定义匿名子程序,语法如下:

$FunctionRef   =  sub { #The body of this function };

定义匿名子程序时,最后面的分号是必须的,因为这是一个赋值语句;

还可以定义空的子程序,语法如下:

sub  子程序名 {}

sub  子程序名(参数列表)  {}

空的子程序什么都不做,没有实际意义,表示这些子程序的功能暂时不明确,优待以后实现或扩充;

二、子程序的调用:

Perl中,子程序的调用语法有多种,不同的调用语法对传给子程序的参数有不同的影响;数组“@_”是Perl中的一个重要的数组,也是一个内置数组,它的作用是用于存放子程序所收到的参数列表

子程序的调用方法从调用方式上来分,可以分为直接调用和间接调用;使用引用来调用子程序的方式称为间接调用;不使用引用来调用子程序的方式称为直接调用;

在Perl5之前(不包括Perl5)的版本中,调用子程序的时候要求在子程序名前面加上位与运算符“&”,以告诉Perl解释器让这个子程序采用自己的参数列表;在Perl5中当然可以继续这样使用,而且功能一样,但是在Perl5新增加的一种引用功能中,用子程序引用的方式来调用子程序的语法如下:

&$FunRef(参数列表);

这个时候位与运算符&会告诉Perl解释器从子程序列表中寻找子程序引用的地址;所以在Perl5中最好不要再使用位与运算符和子程序引用方式来调用子程序;它会与老版本中的位与运算符在代码阅读上产生不易理解的现象;

子程序调用方法列表:

1、SubFunName;

      直接调用,把所在块的全局@_数组作为参数列表传递给被调子程序;

2、SubFunName(参数列表);

      直接调用,生成@_数组的局部备份,设置为参数表的标量值;

3、SubFunName  参数列表;

      直接调用,生成@_数组的局部备份,设置为参数表的标量值;这个时候调用的子程序必须是事先已经声明过

      的子程序;

4、&SubFunName;

      直接调用,把所在块的全局@_数组作为参数表传递给被调子程序;

5、&SubFunName(参数列表);

      直接调用,生成@_数组的局部备份,设置为参数表的标量值;

6、&$SubFunRef;

      间接调用,用子程序的引用来调用子程序,位与运算符&是必须的;把所在块的全局@_数组作为参数列表传递

      给被调子程序;

7、&$SubFunRef  参数列表;

      间接调用,生成@_数组的局部备份,数组值与参数表的标量值相等;

在Perl5中一般使用直接调用的方式来调用子程序就可以了,只要调用子程序时传递的参数符合子程序定义时的参数列表中的参数的规则就可以;如果调用子程序时,传递的参数不符合该子程序在定义时给出的参数列表中的参数的规则的话,程序就会有语法错误,这种情况下,解决该问题的方法就是在调用子程序时在该子程序名前面加上按位与运算符“&”,以告诉Perl解释器,强制使用传递给该子程序的实际参数列表或者是强制使用所在块的全局@_数组作为实际参数列表传递给该子程序;这就是按位与运算符“&”的用途;通过在子程序名称前加按位与运算符(&)调用,可以在任一表达式中调用子程序;

调用子程序时要注意以下几点:

◆ 如果没有参数列表,并且在调用子程序时使用了按位与运算符&,则所在块的全局@_数组的备份传递给子程序;

◆ 如果调用子程序时使用了参数列表(实参列表),则@_数组生成为参数列表的局部备份;

◆ 如果把按位与运算符&与实际参数列表一起使用,并且实际参数列表放在圆括号内,则实际参数列表传递给被调用的子程序,并且备份在局部@_数组中;

◆ 如果实际参数列表不放在圆括号中,则全局@_数组的备份就会被传递给被调用的子程序;

◆ 实现递归子程序时需要注意:除了不被子程序改变的变量之外,其余的变量都必须是局部的,而且还要含有结束调用子程序本身的递归结束条件;

三、子程序的参数列表:

如果函数调用的后面跟着一个用圆括号括起来的列表,则在函数调用期间,这个列表将被Perl解释器自动备份存储在Perl的内置特殊数组变量@_中,函数可以访问这个特殊的变量,以确定参数的个数及赋值;

在Perl中,不带参数列表声明和定义的子程序在被调用时可以不限制传递给该子程序的参数的个数和类型,而带参数列表声明和定义的子程序在被调用的时候必须按照声明和定义时给出的参数规则来调用,否则会出现调用错误。

在声明或定义函数时,函数名称后面的参数列表称为形式参数(简称形参);在调用函数时,函数名称后面的参数列表称为实际参数(简称实参);

声明或定义子程序时,形参列表定义了子程序所需要使用的参数个数和类型。定义形参列表时,要把每个参数的类型指示符放在圆括号中,每个类型指示符定义这个位置上所需要的参数的类型。

参数列表中使用分号(;)把必选参数和可选参数分开,分号前面列出的参数是必选参数,分号后面列出的参数是可选参数;

在Perl中,如果声明或定义函数参数前面有反斜杠“/”,就表示要写入内置特殊数组@_中的是引用变量。输入的参数的类型必须与声明或定义时给出的对应参数的类型相同;即,有反斜杠的形参传递的是变量的引用;

参数列表样本:

1、():

不要求有参数,即:可以不接受任何参数,也可以接受任意类型和个数的参数;

2、($):

要求只有一个参数,并且必须是个标量参数;

3、($;/%):

要求有一个必选参数(标量)和一个可选参数(哈希变量的引用);分号前面的是一个必选参数,分号后面的那个是一个可选参数,但这个可选参数必须是对一个哈希变量的引用;结果是必选参数和哈希变量的引用被存入数组@_中;

4、($$$@):

要求前面的三个参数是标量参数,后面其余的参数放在后面的数组类型变量中;

5、(/@/%$;$$) :

要求前三个参数是必选参数,后两个参数是可选参数;第一个参数是数组的引用,第二个参数是哈希变量的引用,第三个参数是上下文中的标量变量;后两个可选参数是标量变量;

如果声明或定义的参数前面不加反斜杠,则形参强制类型指定符上下文成为实参;比如:形参是标量类型指定符,但是实参却是数组,则对实参采用标量上下文,即把数组的长度传递给子程序,而不是数组值;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值