来源:linux宝库作者:linux宝库 发布时间:2007-09-30 00:00:00


六、递归子程式
PERL中,子程式能够互相调用,其调用方法和上述相同,当调用该子程式本身时,即成了递归子程式。递归子程式有两个条件:
1、除了不被子程式改变的变量外,任何的变量必须的局部的;
2、该子程式要含有停止调用本身的代码。
七、用别名传递数组参数
1、用前面讲到的调用方法&my_sub(@array)将把数组@array的数据拷贝到子程式中的变量@_中,当数组很大时,将会花费较多的资源和时间,而用别名传递将不做这些工作,而对该数组直接操作。形式如:
@myarray = (1, 2, 3, 4, 5);
&my_sub(*myarray);
sub my_sub {
my (*subarray) = @_;
}
2、此方法类似于C语言中的传递数组的起始地址指针,但并不相同,在定义数组的别名之后,假如有同名的简单变量,则对该变量也是起作用的。如:
$foo = 26;
@foo = ("here’s", "a", "list");
&testsub (*foo);
...
sub testsub {
local (*printarray) = @_;
...
$printarray = 61;
}
当子程式执行完,主程式中的$foo的值已成了61,而不再是26了。
3、用别名的方法能够传递多个数组,如:
@array1 = (1, 2, 3);
@array2 = (4, 5, 6);
&two_array_sub (*array1, *array2);
sub two_array_sub {
my (*subarray1, *subarray2) = @_;
}
在该子程式中,subarray1是array1的别名,subarray2是array2的别名。
八、预定义的子程式
PERL5预定义了三个子程式,分别在特定的时间执行,他们是:BEGIN子程式在程式启动时被调用;END子程式在程式结束时被调用;AUTOLOAD子程式在很难找到某个子程式时被调用。您能够自己定义他们,以在特定时间执行所需要的动作。如:
BEGIN {
print("Hi! Welcome to Perl!n");
}
AUTOLOAD{
print("subroutine $AUTOLOAD not foundn"); # 变量$AUTOLOAD即未找到的子程式名
print("arguments passed: @_n");
}
若同一个预定义子程式定义了多个,则BEGIN顺序执行,END逆序执行。
|
还没有关于此文章的相关评论!