一、定义
函数可分为系统函数和用户函数。子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读。PERL中,子程序可以出现在程序的任何地方。定义方法为:
sub subroutine{ statements; }
&subname; ... sub subname{ ... }
sub subname{ ... } ... subname;
sub subname; ... subname; ... sub subname{ ... }
my($scalar) = 43; local(@array) = (1, 2, 3);
&sub1(&number1, $number2, $nubmer3); ... sub sub1{ my($number1, $number2, $number3) = @_; ... }
&addlist (@mylist); &addlist ("14", "6", "11"); &addlist ($value1, @sublist, $value2); ... sub addlist { my (@list) = @_; ... }
sub twolists { my (@list1, @list2) = @_; }
&twoargs(47, @mylist); # 47赋给$scalar,@mylist赋给@list &twoargs(@mylist); # @mylist的第一个元素赋给$scalar,其余的元素赋给@list ... sub twoargs { my ($scalar, @list) = @_; ... }
PERL中,子程序可以互相调用,其调用方法与上述相同,当调用该子程序本身时,即成了递归子程序。递归子程序有两个条件:1、除了不被子程序改变的变量外,所有的变量必须的局部的;2、该子程序要含有停止调用本身的代码。
七、用别名传递数组参数
1、用前面讲到的调用方法&my_sub(@array)将把数组@array的数据拷贝到子程序中的变量@_中,当数组很大时,将会花费较多的资源和时间,而用别名传递将不做这些工作,而对该数组直接操作。形式如:
@myarray = (1, 2, 3, 4, 5); &my_sub(*myarray); sub my_sub { my (*subarray) = @_; }
$foo = 26; @foo = ("here's", "a", "list"); &testsub (*foo); ... sub testsub { local (*printarray) = @_; ... $printarray = 61; }
@array1 = (1, 2, 3); @array2 = (4, 5, 6); &two_array_sub (*array1, *array2); sub two_array_sub { my (*subarray1, *subarray2) = @_; }
BEGIN { print("Hi! Welcome to Perl!\n"); } AUTOLOAD{ print("subroutine $AUTOLOAD not found\n"); # 变量$AUTOLOAD即未找到的子程序名 print("arguments passed: @_\n"); }