方法和函数或子过程是同样的方式定义的,只是调用方式不同
1.0 语法:
声明一个命名子过程,但不定义它,使用下面的形式:
sub NAME BLOCK
创建一个匿名子过程或子句,把NAME去掉就可以:
sub BLOCK
[root@node01 6]# cat a1.pl
$subref = sub {
my $a=shift;
my $b=shift;
return $a + $b;
};
print $subref->(23,34);
[root@node01 6]# perl a1.pl
57[root@node01 6]#
可以用下面的方法引入在另外一个模块中定义的子过程:
[root@node01 6]# cat Pkg01.pm
package Pkg01;
require Exporter;
@ISA = qw(Exporter);
@EXPORT_OK = qw($munge frobnicate); # symbols to export on request
$munge="d1dsad1`131";
sub frobnicate{
my $a=shift;
my $b=shift;
return $a*$b;
};
1 ;
[root@node01 6]# cat a2.pl
use Pkg01 qw($munge frobnicate);
print $munge;
print "
";
print frobnicate(99 ,35);
[root@node01 6]# perl a2.pl
d1dsad1`131
3465[root@node01 6]#
间接调用子过程(通过名字或引用),可以使用下面的任何一种方法:
2.0 语意:
3.0 传入引用:
如果你想在一个函数中传入或传出不止一个的数组或散列结构,同时你虚妄它们保持它们的一致性
[root@node01 6]# cat a3.pl
sub sum {
my $aref=shift;
my $total=0;
foreach (@{$aref}) {
$total = $_ + $total;
};
return $total;
};
my @a=(1,4,7,23,4);
print sum(@a);
[root@node01 6]# perl a3.pl
39[root@node01 6]#
[root@node01 6]# cat a4.pl
sub popmany {
foreach $aref (@_){
push @retlist,pop @$aref;
}
return @retlist;
};
my @a=(a1,a2,a3,a4);
my @b=(b1,b2,b3,b4);
my @c=(c1,c2,c3,c4);
my @d=(d1,d2,d3,d4);
@tail=popmany(@a,@b,@c,@d);
print @tail;
[root@node01 6]# perl a4.pl
a4b4c4d4[root@node01 6]#
4.0 函数原型:
Perl 可以让你定义你自己的函数,这些函数可以像perl的内建函数一样调用。
例如push(@array,$item),它必须接收一个@array
[root@node01 6]# cat a5.pl
my @array=('a1','a2','a3','a4');
push (@array,"xxx");
print @array;
[root@node01 6]# perl a5.pl
a1a2a3a4xxx[root@node01 6]#
函数原型:
sub mylink ($$):
[root@node01 6]# cat a6.pl
sub mylink($$){
my ($a,$b)=@_;
return $a + $b;
};
print mylink(3,5);
[root@node01 6]# perl a6.pl
8[root@node01 6]#
[root@node01 6]# cat a7.pl
sub myreverse (@){
my $a=shift;
my $b=shift;
my $c=shift;
return $a + $b + $c;
};
my @a=(1,4,7);
print myreverse(@a);
[root@node01 6]# perl a7.pl
12[root@node01 6]#
4.1 内联常量函数:
5.0 子过程属性:
子过程的定义和声明能够附带一些属性,如果属性列表存在,它使用空格或者冒号分割
5.3 左值属性:
除非你定义子过程返回一个左值,否则你不能从子过程中返回一个可以修改的标量值: