Perl子程序(函数)和引用

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来判断,返回列表如下:

实例:

循环引用

循环引用在两个引用相互包含时出现。需要小心使用,不然会导致内存泄漏

实例

引用函数

函数引用格式:\&

调用引用函数格式: & + 创建的引用名

实例

你可能感兴趣的:(Perl子程序(函数)和引用)