zoukankan      html  css  js  c++  java
  • 第6章 子过程:

    第6章 子过程:


    像其他的语言一样,Perl也支持自定义的子过程。(注:我们也把它们叫做函数,不过函数和子过程在perl里一样的东西。




    有时候我们甚至叫它们方法,方法和函数或子过程是同样的方式定义的,只是调用方式不同)




    1.0 语法:


    声明一个命名子过程,但不定义它,使用下面的形式:


    sub NAME


    sub NAME PROTO


    sub NAME ATTRS


    sub NAME PROTO ATTRS


    声明并且定义一个命名子过程,加上一个{};




    对于没有NAME的形式,你还必须提供调用子过程的方法,因此你必须保存返回值,因为这种形式的sub声明方法不但在编译的时候编译,


    同时也产生一个允许时的返回值,所以我们就可以保证保存它:


    [root@master big]# cat a1.pl 
    use Data::Dumper;  
    $subref= sub { return aa};
    my $xx= Dumper($subref);      
    print "111111111 ";  
    print $xx;      
    print " ";
    print "222222222222 ";
    print $subref;
    print " ";
    print "3333333333 ";
    $yy=&$subref();
    print $yy;
    print " ";
    [root@master big]# perl a1.pl 
    111111111
    $VAR1 = sub { "DUMMY" };


    222222222222
    CODE(0xcdf350)
    3333333333
    aa
    use base qw(
        Weixin::Message 
        Weixin::Client::Callback
        Weixin::Client::Operate
        Weixin::Client::Friend
        Weixin::Client::Chatroom
        Weixin::Client::Request 
        Weixin::Client::Cron
        Weixin::Client::Plugin
        Weixin::Client::Base
    );


    use MODULE qw(NAME1 NAME2 NAME2...)




    直接调用子过程可以用下面的方法:


    1.NAME(LIST)    ##有圆括号时&是可选的


    2.NAME LIST #如果预声明/输入了子过程,那么圆括弧是选的


    3. &$subref  ##把当前的@_输出到该子过程


    2.0 语意:




    在你记住所有语法前,你只需要记住下边这种定义子过程的普通方法:






    [root@master big]# cat a2.pl 
    sub razzle{
      print "Ok,you've been razzled. ";
    }


    razzle();
    [root@master big]# perl a2.pl 
    Ok,you've been razzled.






    现在,如果你将设计一种可以支持不定数量的任意参数的语言,你最好让你的语言在处理这些任意长的参数列表上容易些,




    所有传入Perl过程的参数都是以@_身份传入的。 如果你调用一个有两个参数的函数,它们在函数内部可以作为@_数组的前两个成员访问:




    $_[0] 和$_[1]  


    子过程(其他的程序块也一样)的返回值是过程最后一个表达式的只,或者你可以在子过程的任何一个地方明确使用一个return


    语句来返回值并且退出子过程


    [root@master big]# cat a1.pl 
    use Data::Dumper;  
    $subref= sub { return aa;print "bb "};
    $yy=&$subref;
    print $yy;
    print " ";
    [root@master big]# perl a1.pl 
    aa






    [root@master big]# cat a3.pl 
    sub test {
          $a = shift;
          $b = shift;
          $c = shift;
         return $a + $b + $c;
    };
    $xx=test(1,2,3);
    print "$xx ";
    [root@master big]# perl a3.pl 
    6


    2.2 错误提示






    [root@master big]# cat a3.pl 
    sub test {
          $a = shift;
          $b = shift;
         eval {return $a / $b} ;
         if ($@){return aaaaaaaa}else{return bbbbbbbbbb};
    };
    $xx=test(9,3);
    print "$xx ";
    [root@master big]# perl a3.pl 
    bbbbbbbbbb






    [root@master big]# cat a3.pl 
    sub test {
          $a = shift;
          $b = shift;
         eval {return $a / $b} ;
         if ($@){return aaaaaaaa}else{return bbbbbbbbbb};
    };
    $xx=test(9,0);
    print "$xx ";
    [root@master big]# perl a3.pl 
    aaaaaaaa






    3.0 传入引用:




    这里有几个简单的例子,首先,让我们定义一个函数,这个函数使用数组的引用作为参数,当这个数组非常大时,作为一个引用传递


    要比传入一长列值要快的多:




    [root@master big]# cat a4.pl 
    sub sum {
        my $aref = shift;
     print "@ref is @$aref ";
    foreach (@$aref) {$total += $_};
       return $total;
    };
    my @a=(1, 4, 7);
    $xx = sum(@a);
    print $xx;
    print " ";
    print "$total is $xx ";
          
    [root@master big]# perl a4.pl 
    @ref is 1 4 7
    12
    $total is 12




    4.0 函数原型


    Perl 可以让你定义你自己的函数,这些函数可以像Perl的内建函数一样调用,例如 push(@array,$item);




    4.1  内联常量函数:


    带有() 的函数原型表示这个函数没有任何参数,就像内建函数time一样


    [root@master big]# cat a5.pl 
    sub PI () { 4 * atan2(1, 1) } ;
    $xx=&PI();
    print "$xx is $xx ";
    [root@master big]# perl a5.pl 
    $xx is 3.14159265358979
    [root@master big]# 








    5.0 子过程属性







































































































































































































































































































































  • 相关阅读:
    CentOS6.4 安装nmon
    CentOS6.4 访问域局网中Windows的共享
    将类似 12.56MB 36.89KB 转成 以K为单位的数字【备忘】
    ICE中间件相关
    HDFS介绍
    漫画描述HDFS工作原理
    离线安装Cloudera Manager 5和CDH5
    storm集群相关资料
    kafka相关资料
    jstatd
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351092.html
Copyright © 2011-2022 走看看