子过程:
对于没有 NAME 的形式,你还必须提供调用子过程的方法.因此你必须保存返回值,因为
这种形式的 sub 声明方法不但在编译的时候编译,同时也产生一个运行时的返回值,所以
我们就可以保证保存它:
可以用下面的方法引入在另一个模块中定义的子过程:
use MODULE qw(NAME1 NAME2 NAME2...)
[root@wx03 2]# cat Horse.pm
package Horse;
use Exporter 'import';
our $days="test111";
@EXPORT = qw(fun1);
sub fun1 {
my $a=shift;
my $b=shift;
return $a + $b;
};
1;
[root@wx03 2]# cat a1.pl
unshift(@INC,"/root/big/2");
use Horse qw/fun1/;
print $Horse::days;
print "\n";
Horse::fun1(55,23);
print "\n";
print fun1(131,23);
print "\n";
[root@wx03 2]# perl a1.pl
test111
154
间接调用子过程(通过名字或引用),可以使用下面的任何一种方法:
[root@wx03 3]# cat t1.pl
sub fun1 {
my $a =shift;
my $b = shift;
return $a + $b
};
$subref=\&fun1;
print "第一种........\n";
print &$subref(23,45);
print "\n";
print "第二种.........\n";
print $subref->(20,30);
print "\n";
print "第三种.........\n";
print &$subref(23,323);
print "\n";
[root@wx03 3]# perl t1.pl
第一种........
68
第二种.........
50
第三种.........
346
2.0 语意
2.1 参数列表的技巧
[root@wx03 3]# cat t2.pl
sub aysetenv {
my ($key, $value) = @_;
$hash{$key} = $value unless $ENV{$key};
};
&aysetenv(a,a1);
&aysetenv(b,b1);
&aysetenv(c,c1);
print %hash;
print "\n";
print $hash{a};
print "\n";
[root@wx03 3]# perl t2.pl
cc1aa1bb1
a1
你可以一次将 @_ 填入一个散列:
2.2 错误指示
3.0 传入引用:
[root@wx03 3]# cat t3.pl
@a=qw/a1 b2 c3 d4/;
sub sum {
my ($aref) = @_;
my ($total) = 0;
foreach (@$aref) { print "\$_ is $_\n"; }
};
sum(\@a);
[root@wx03 3]# perl t3.pl
$_ is a1
$_ is b2
$_ is c3
$_ is d4
4.0 函数原型
5.0 子过程属性: