用sub来定义一个子程序,可以有多种方式来调用:
- #在定义前调用
- show; #在定义前这种调用方式无效,但不出现编译错误
- show();
- &show;
- &show();
- do show; #这种方式调用无效,但不会出现编译错误
- do show();
- #函数定义
- sub show {
- print "here\n";
- }
- #在定义后调用
- show; #在定义后可以正常调用
- show();
- &show;
- &show();
- do show; #这种方式无法调用,但不会出现编译错误
- do show();
用@_可以得到函数参数。一个简单的加法函数:
- sub add {
- $ret = @_[0] + @_[1]; # @_是函数参数数组
- }
- $sum = &add(3, 2); # 5 用&调用函数
- $sum = add(3, 2); # 5 直接用函数名调用
- $sum = do add(3, 2); # 5 用do调用函数
- $sum = add(3); # 3 第二个参数为0
- $sum = add 3; # 3 缺省圆括号的方式调用
- $sum = add(3, 2, 1); # 5 多余的参数不起作用
返回值可以用return语句返回,如果没有return语句,则最后被修改的变量就是返回值:
- sub getone { return 1; }
- sub gettwo { 2; } # 等价于$_=2。$_是在不指定变量情况下所使用的变量。
- sub getthree { $a = 3; }
- sub getfour { $a = 1; $b = 3; $c = 4; }
- sub getfive { $a = 2; $b = 3; $a + $b; }
- sub getarray { $a = 3; @array=(1, 2, 3); }
my和local都可以用来定义局部变量,区别在于函数中的local在其调用的子程序中仍然可见:
- sub inner {
- print "$my \n"; # null
- print "$local \n"; # 7
- }
- sub outer {
- my $my = 5;
- local $local = 7;
- inner;
- }
- outer;
Perl有三个预定义的子程序:BEGIN在程序启动时调用;END在程序结束时调用;AUTOLOAD在调用的子程序找不到时调用:
- END {
- print "End:\n";
- }
- AUTOLOAD{
- print "$AUTOLOAD is not found\n"; # $AUTOLOAD是没找到的子程序名
- print "arguments: @_\n"; #传进来的参数
- }
- notdefined(1, 2, 3); # 调用没定义的子程序
- BEGIN {
- print "Begin:\n";
- }
输出:
- Begin:
- main::notdefined is not found
- arguments: 1 2 3
- End:
阅读(796) | 评论(0) | 转发(0) |