Perl的函数
Perl函数也叫子程序,就是用户定义的函数。为了方便,我一律称为函数,不称子程序。Perl函数的语法格式如下所示:
|
|
调用函数的语法格式为subroutine( 参数列表 )
,如下所示:
由于在设计Hello
函数时,并没有设计相应的参数,因此在运行时就不需要加参数,但是还需要加上括号。
向函数传递参数
Perl 函数可以和其他编程语言一样接受多个参数,函数参数使用特殊数组@_
标明。因此函数第一个参数为_[0]
, 第二个参数为_[1]
, 以此类推,用户可以通过改变@_
数组中的值来改变相应实际参数的值。。不论参数是标量型还是数组型的,用户把参数传给函数时,perl默认按引用的方式调用它们,如下所示:
代码解释:scalar不是求元素个数,它用来产生一个标量环境,对数组进行操作时,会返回元素个数。$n = scalar(@_)
就是获取所有传入的参数的个数,在这段代码中,n值就是3。
向函数传递列表
由于@_
变量是一个数组,所以它可以向函数中传递列表。但如果我们需要传入标量和数组参数,需要把列表放在最后一个参数上,如下所示:
向函数传递哈希
当向函数传递哈希表时,它将复制到@_
中,哈希表将被展开为键/值组合的列表,如下所示:
函数返回值
函数可以向其他编程语言一样使用retur
语句来返回函数值。如果没有使用return
语句,则函数的最后一行语句将作为返回值,如下所示:
函数的局部变量
默认情况下,Perl 中所有的变量都是全局变量,这就是说变量在程序的任何地方都可以调用。如果我们需要设置私有变量(私有变量其实与其他编程语言中的局部变量是一样的,后文一律称为局部变量),可以使 my
操作符来设置。my
操作符用于创建作用域变量,通过my
创建的变量,存活于声明开始的地方,直到闭合作用域的结尾。闭合作用域
指的可以是一对花括号中的区域,可以是一个文件,也可以是一个if, while, for, foreach, eval
字符串。它的用法如下所示:
以下案例就演示了如何声明一个或多个局部变量:
变量的临时赋值
我们可以使用 local 为全局变量提供临时的值,在退出作用域后将原来的值还回去。local定义的变量不存在于主程序中,但存在于该函数和该函数调用的函数中。定义时可以给其赋值,如下所示:
静态变量
state
关键字将局部变量永久存在。state也是词法变量,所以只在定义该变量的词法作用域中有效,如下所示:
注1:state仅能创建闭合作用域为函数内部的变量。
注2:state是从Perl 5.9.4开始引入的,所以使用前必须加上 use。
注3:state可以声明标量、数组、哈希。但在声明数组和哈希时,不能对其初始化(至少Perl 5.14不支持)。
函数调用上下文
函数调用过程中,会根据上下文来返回不同类型的值,比如localtime()
函数,在标量上下文返回字符串,在列表上下文返回列表,如下所示: