<pre name="code" class="html"><pre name="code" class="html">第六章 子过程: 声明一个命名子过程,但不定义它,使用下面的形式: sub NAME sub NAME PROTO sub NAME ATTRS sub NAME PROTO ATTRS 声明并且定义一个命名子过程,加上一个 BLOCK: sub NAME BLOCK sub NAME PROTO BLOCK sub NAME ATTRS BLOCK sub NAME PROTO ATTRS BLOCK 创建一个匿名子过程或子句,把 NAME 去掉就可以: sub BLOCK sub PROTO BLOCK sub ATTRS BLOCK sub PROTO ATTRS BLOCK 对于没有 NAME 的形式,你还必须提供调用子过程的方法.因此你必须保存返回值,因为 这种形式的 sub 声明方 法不但在编译的时候编译,同时也产生一个运行时的返回值,所以 我们就可以保证保存它: $subref = sub BLOCK; [root@wx03 big]# cat a1.pl $subref= sub {return "test "}; ##返回函数引用 print $subref; print " "; print "2222222222222 "; print &$subref; [root@wx03 big]# perl a1.pl CODE(0x1b53b30) 2222222222222 test 子过程(其他的程序块也一样)的返回值是过程最后一个表达式的值.或者你可以在子过程的 任何一个地方明确使用 一个 return 语句来返回值并且退出子过程 return 退出子程序 [root@wx03 2]# cat a4.pl $subref = sub {print "111 ";}; print $subref ; print " "; print &$subref; [root@wx03 2]# perl a4.pl CODE(0x17d5b30) 111 1[root@wx03 2]# [root@wx03 2]# perl a5.pl Ok, you've been razzled. 1 [root@wx03 2]# cat a5.pl sub razzle { print "Ok, you've been razzled. "; } $str=razzle(); print $str; print " "; [root@wx03 2]# perl a5.pl Ok, you've been razzled. 1 返回值使用return 就没有1这种返回值: [root@wx03 2]# cat a5.pl sub razzle { return "Ok, you've been razzled. "; } $str=razzle(); print $str; print " "; [root@wx03 2]# perl a5.pl Ok, you've been razzled. 所有传入 Perl 过程的参数都是以 @_ 身份传入的 一个 return 语句来返回值并且退出子过程 2.2 错误指示 Perl 中实现这个目的最自然的 一种方法就是用一个不带参数的 return 语句.这样当函数在标量 环境中使用时,调用者得到一个 undef,如果在 列表环境中使用,调用者得到一个空列表. 3.0 传入引用