您的位置:首页 > 其它

Perl-13---子程序-2

2010-11-02 17:09 267 查看
一、参数中的数组和哈希变量:

在定义参数列表的时候,有两种方法可以定义数组或哈希变量为输入参数:

1、在数组或哈希变量形参类型名前面加上反斜杠“/”;

2、把数组或哈希变量形参类型名放在参数列表中最后面的位置上;

作为参数传递的数组或哈希变量都将会被复制到参数列表的标量变量列表中,生成个数不确定的参数列表;实际上标量变量和加反斜杠“ /”的数组或哈希变量都是最常用的形参类型,因为哈希变量或数组类型指示符可以包含剩余的所有参数;

在程序编译时,输入到内置数组@_中的值是引用变量,所以说,@_数组实际上是一个引用数组;Perl5中把每个标量变量的引用复制到数组@_中,如果使用数组单元(如:$_[0])来修改数组@_中的内容,则修改的是传入到参数表中的实际变量本身,而不是变量的备份;

这种传递参数的方式称为按引用调用(传地址),参数表引用内存中的实际变量;还有一种与按引用调用相对的调用方式叫按数值调用,这种调用方式通过把实际参数的值复制到词法变量表中来实现的,然后再操作词法变量表中的参数,此时修改的是备份的参数,不必担心会修改到实际参数;按数值调用,就是做一个参数的Copy,对于大数据对象不合适;

直接修改输入的实际参数并不完美,所以最好不要使用这种方式;要想通过修改@_数组单元的内容来修改实际参数的值,就必须要让子程序了解输入参数的情况;需要注意的是,直接修改输入参数的值时,调用代码必须使用子程序能够修改的变量,如果调用中使用了直接数,而子程序又要修改实际输入参数,那么酒会==就会出现运行时错误,导致程序崩溃;使用按引用调用时也要注意这一点;

另外,还可以使用别名来传递数组参数;使用&my_sub(@Array)的形式调用数组的时候,Perl会把数组@Array中的所有元素都复制到子程序的@_数组中,当数组@Array很大的时候,这种调用方式将会消耗资源和时间,效率非常低;可以使用别名传递数组来避免这个复制操作,以直接对内存中的数组操作;这种方法类似于C语言中传递数组的地址,但是有所不同,在定义数组的别名之后,如果有同名的简单变量,则对该简单变量起作用;

二、对参数列表的访问:
Perl中有两种方法可以访问参数列表:

1、使用@_数组的下标来访问每一个参数;如:$_[0]表示当前函数的第一个参数;

2、利用shift()函数和pop()函数来访问当前函数的@_数组;

注意:子程序中的变量默认为全局变量,可以使用关键字my或local使其变为局部变量;

Perl中的子程序没有类型,所有子程序都把一个列表作为参数,子程序可以在一个列表中返回,也可以在一个Scalar中返回;Perl中子程序的定义不能嵌套,它们可以在任何地方被定义,除非是在同一个块里面;

三、Perl提供的预定义子程序:

Perl提供了三个预定义的子程序,分别的特定的时间内执行:

◆ BEGIN:在程序启动时被调用;

◆ END:在程序结束时被调用;

◆ AUTOLOAD:在找不到某个子程序时被调用;

程序员可以重新定义这三个子程序,以在特定的时间完成指定的操作;若同一个预定义的子程序定义了多个实现,则BEGIN顺序执行,而END逆序执行;

三、子程序的返回值:

调用子程序所产生的结果,称为返回值;Perl利用返回值把值返回给主调函数;

默认情况下,Perl把子程序结束前所执行的最后一行代码的计算结果做为返回值返回给主调函数,调用子程序的语句中,等号左边的变量上下文(标量上下文或列表上下文)决定了子程序返回值的上下文;

除了默认情况之外,Perl还可以使用关键字return来返回子程序的返回值;return语句可以向调用程序返回子程序的执行结果,并退出子程序的执行,即:return语句显式地指出代码向主调程序返回什么样的值,子程序在何处停止;

return语句的基本语法如下:

return (标量 / 列表);

return语句退出子程序的执行,并返回到调用程序,列表内容是返回的数值;注意:列表中所有的数组将展开成标量值;如果要返回数组或哈希变量,最好返回数组或哈希变量的引用;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: