子过程: 对于没有 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 " "; Horse::fun1(55,23); print " "; print fun1(131,23); print " "; [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 "第一种........ "; print &$subref(23,45); print " "; print "第二种......... "; print $subref->(20,30); print " "; print "第三种......... "; print &$subref(23,323); print " "; [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 " "; print $hash{a}; print " "; [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 $_ "; } }; sum(@a); [root@wx03 3]# perl t3.pl $_ is a1 $_ is b2 $_ is c3 $_ is d4 4.0 函数原型 5.0 子过程属性: