• 第6章 子过程


    方法和函数或子过程是同样的方式定义的,只是调用方式不同
    
    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 左值属性:
    
    除非你定义子过程返回一个左值,否则你不能从子过程中返回一个可以修改的标量值:
    
    

  • 相关阅读:
    理解css中min-width和max-width,width与它们之间的区别联系
    html实现时间轴_纯css实现响应式竖着/垂直时间抽布局效果
    web页面的重构和回流【转载】
    介绍web开发中实现会话跟踪的常用技术方法
    web标签语义化的理解_web语义化是什么意思
    从浏览器地址栏输入url到显示页面的步骤(以HTTP为例)
    H5调用手机的相机/摄像/录音等功能 _input:file的capture属性说明
    相邻元素之间的margin合并问题
    HTML连载33-背景定位
    Java连载22-for循环
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13349731.html
Copyright © 2020-2023  润新知