第六章 子过程:

<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\n"};  ##返回函数引用
print $subref;
print "\n";

print "2222222222222\n";

print &$subref;

[root@wx03 big]# perl a1.pl 
CODE(0x1b53b30)
2222222222222
test



子过程(其他的程序块也一样)的返回值是过程最后一个表达式的值.或者你可以在子过程的 任何一个地方明确使用
一个 return 语句来返回值并且退出子过程

return 退出子程序





[root@wx03 2]# cat a4.pl 
$subref = sub {print "111\n";};
print $subref ;
print "\n";
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.\n";
}
$str=razzle();
print $str;
print "\n";

[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.\n";
}
$str=razzle();
print $str;
print "\n";
[root@wx03 2]# perl a5.pl 
Ok, you've been razzled.


所有传入 Perl 过程的参数都是以 @_ 身份传入的


一个 return 语句来返回值并且退出子过程

2.2 错误指示

Perl 中实现这个目的最自然的
一种方法就是用一个不带参数的 return 语句.这样当函数在标量 环境中使用时,调用者得到一个 undef,如果在
列表环境中使用,调用者得到一个空列表.

3.0 传入引用




   

posted @ 2016-05-16 14:09  czcb  阅读(109)  评论(0编辑  收藏  举报