Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1800758
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: Python/Ruby

2012-03-26 09:43:43

用sub来定义一个子程序,可以有多种方式来调用:
  1. #在定义前调用
  2. show; #在定义前这种调用方式无效,但不出现编译错误
  3. show();
  4. &show;
  5. &show();
  6. do show; #这种方式调用无效,但不会出现编译错误
  7. do show();

  8. #函数定义
  9. sub show {
  10.     print "here\n";
  11. }

  12. #在定义后调用
  13. show; #在定义后可以正常调用
  14. show();
  15. &show;
  16. &show();
  17. do show; #这种方式无法调用,但不会出现编译错误
  18. do show();


用@_可以得到函数参数。一个简单的加法函数:
  1. sub add {
  2.     $ret = @_[0] + @_[1]; # @_是函数参数数组
  3. }

  4. $sum = &add(3, 2); # 5 用&调用函数
  5. $sum = add(3, 2); # 5 直接用函数名调用
  6. $sum = do add(3, 2); # 5 用do调用函数
  7. $sum = add(3); # 3 第二个参数为0
  8. $sum = add 3; # 3 缺省圆括号的方式调用
  9. $sum = add(3, 2, 1); # 5 多余的参数不起作用

 

返回值可以用return语句返回,如果没有return语句,则最后被修改的变量就是返回值:


  1. sub getone { return 1; }
  2. sub gettwo { 2; } # 等价于$_=2。$_是在不指定变量情况下所使用的变量。
  3. sub getthree { $a = 3; }
  4. sub getfour { $a = 1; $b = 3; $c = 4; }
  5. sub getfive { $a = 2; $b = 3; $a + $b; }
  6. sub getarray { $a = 3; @array=(1, 2, 3); }

my和local都可以用来定义局部变量,区别在于函数中的local在其调用的子程序中仍然可见:


  1. sub inner {
  2.     print "$my \n"; # null
  3.     print "$local \n"; # 7
  4. }

  5. sub outer {
  6.     my $my = 5;
  7.     local $local = 7;
  8.     inner;
  9. }

  10. outer;

Perl有三个预定义的子程序:BEGIN在程序启动时调用;END在程序结束时调用;AUTOLOAD在调用的子程序找不到时调用:


  1. END {
  2.     print "End:\n";
  3. }

  4. AUTOLOAD{
  5.     print "$AUTOLOAD is not found\n"; # $AUTOLOAD是没找到的子程序名
  6.     print "arguments: @_\n"; #传进来的参数
  7. }

  8. notdefined(1, 2, 3); # 调用没定义的子程序

  9. BEGIN {
  10.     print "Begin:\n";
  11. }

输出:
  1. Begin:
  2. main::notdefined is not found
  3. arguments: 1 2 3
  4. End:

阅读(796) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~