第6章 子过程

来源:互联网 发布:清朗网络 青年力量海报 编辑:程序博客网 时间:2024/05/17 02:48
方法和函数或子过程是同样的方式定义的,只是调用方式不同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`1313465[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 左值属性:除非你定义子过程返回一个左值,否则你不能从子过程中返回一个可以修改的标量值: