子过程:
对于没有 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 子过程属性: