Perl子程序(函数)
Perl子程序也就是用户自定义的函数
Perl子程序可以出现在程序的任何地方,语法格式如下:
sub subroutine{
statements;
}
调用子程序语法格式: subroutine( 参数列表 );
在Perl5.0以下版本调用子程序方法如下:&subroutine( 参数列表 );
向子程序传递参数
Perl子程序可以和其他编程一样接受多个参数,子程序参数使用特殊数组@_表明。因此子程序第一个参数为$_[0], 第二个参数为$_[1],以此类推。
不论参数是标量型还是数组型的,用户把参数传给子程序时,perl默认按引用的方式调用。
用户可以通过改变@_数组中的值来改变相应实际参数的值。
向子程序传递列表
由于@_变量是一个数组,所以它可以向子程序中传递列表。
但如果需要传入标量和数组参数时,需要把列表放在最后一个参数上。我们可以向子程序传入多个数组和哈希,但是在传入多个数组和哈希时,会导致丢失独立的标识。所以我们需要使用引用。
向子程序传递哈希
当向子程序传递哈希时,它将复制到@_中,哈希表将被展开为键/值组合的列表。
子程序返回值
子程序可以向其他编程语言一样使用 return语句来 返回函数值。
如果没有使用return语句,则子程序的最后一行语句 将作为返回值。
子程序的私有变量
默认情况下,Perl中所有的变量都是全局变量,也就是说变量在程序的任何地方都可以调用。如果需要设置私有变量,可以使用my操作符来设置。
my操作符用于创建作用域变量,通过my创建的变量,存活于声明开始的地方,直到闭合作用域的结尾。
闭合作用域指的可以是一对花括号中的区域,可以是一个文件,也可以是一个 if, while, for, foreach, eval字符串。
实例:
变量的临时赋值
可以使用local为全局变量提供临时的值,在退出作用域后将原来的还原。
local定义的变量不存在于主程序中,但存在于该子程序和该子程序调用的子程序中。定义时可以给其赋值。
静态变量
state操作符功能类似于static修饰符,state关键字将局部变量变得持久。state也是词法变量,所以只在定义该变量 的词法作用域中有效。
1. state仅能创建闭合作用域为子程序内部的变量
2. state是从Perl 5.9.4开始引入的,所以使用前必须加上use
3. state可以声明标量,数组,哈希。但在声明数组 和哈希时,不能对它初始化。
子程序调用上下文
子程序调用过程中,会根据上下文来返回不同类型的值,比如以下 localtime() 子程序,在标量上下文返回字符串,在列表上下文返回列表:
Perl引用
引用就是指针,Perl引用是一个标量类型可以指向变量,数组,哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方。
创建引用
定义变量的时候,在变量名前面加个\,就得到了这个变量的引用
在数组中我们可以用匿名数组引用,使用 [] 定义:
$aref= [ 1,"foo",undef,13 ];
匿名数组的元素仍然可以是匿名数组,所以我们可以用这种方法构造数组的数组,可以构造任意维度的数组。
my $aref = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
在哈希中我们可以用匿名哈希引用,使用 {} 定义:
$href= { APR =>4, AUG =>8 };
我们也可以创建一个没有子程序名的匿名子程序引用:
$coderef = sub { print "W3CSchool!\n" };
取消引用
取消应用可以根据不同的类型使用 $, @ 或 % 来取消
实例:
如果不能确定变量类型,可以使用ref来判断,返回列表如下:
实例:
循环引用
循环引用在两个引用相互包含时出现。需要小心使用,不然会导致内存泄漏
引用函数
函数引用格式:\&
调用引用函数格式: & + 创建的引用名