方法和函数或子过程是同样的方式定义的,只是调用方式不同

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 "\n";

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 左值属性:

除非你定义子过程返回一个左值,否则你不能从子过程中返回一个可以修改的标量值: