• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    perl中子程序中参数的两种引用(传递)方式介绍

    下面是一个例子:

    复制代码 代码如下:

    use strict;
    #这里是两个数组
    my @i =('1','2','3');
    my @j =('a','b','c');

    #在进行处理之前,我们把他们先打印出来,看一看他们的样子
    print "In main program before calling subroutine:i="."@i\n";
    print "In main program before calling subroutine:j="."@j\n";

    #然后我们通过子程序进行处理
    reference_sub(@i,@j);
    print "In main program after calling subroutine:i="."@i\n";
    print "In main program after calling subroutine:j="."@j\n";
    #下面是子程序
    sub reference_sub
    {
     my (@i,@j)=@_;
     print "In subroutine:i="."@i\n";
     print "in subroutine:j="."@j\n";

     #这里我们对@_的处理用pop,和shift来进行
     push(@i,'4');
     shift(@j);
    }


    得到的结果如下:
    复制代码 代码如下:

    F:\&;perl\a.pl
    In main program before calling subroutine:i=1 2 3
    In main program before calling subroutine:j=a b c
    In subroutine:i=1 2 3 a b c
    in subroutine:j=
    In main program after calling subroutine:i=1 2 3
    In main program after calling subroutine:j=a b c
    F:\&;

    在这个例子中,子程序中有两个参数@i和@j,当我们将这两个参数传递到子程序的时候,子程序将他们全部放入了内置数组@_中,然后在@_中@i和@j的不同没有了,也就是在@_中混为一谈了,无法区分。当我们想重新得到他们两个的时候,我们发现,@i=1 2 3 a b c,而@j为空。在很多时候这显然不是我们想要得到的结果,所以我们要用到pass by reference(在大骆驼书第六章中被翻译为”传入引用“)
    我们仅仅把代码做一个变动,也就是在
    程序如下:
    复制代码 代码如下:

    use strict;

    #这里是两个数组
    my @i =('1','2','3');
    my @j =('a','b','c');

    #在进行处理之前,我们把他们先打印出来,看一看他们的样子
    print "In main program before calling subroutine:i="."@i\n";
    print "In main program before calling subroutine:j="."@j\n";

    #然后我们通过子程序进行处理
    reference_sub(\@i,\@j);#在这里我们添加了反斜线,也就是pass byreference(传入引用,在大骆驼书中第六章翻译)
    print "In main program after calling subroutine:i="."@i\n";
    print "In main program after calling subroutine:j="."@j\n";
    #下面是子程序
    sub reference_sub
    {
     my ($i,$j)=@_;#引用也是一种特殊的数据形式,它们在@_中都被当成标量变量来储存
     print "In subroutine:i="."@$i\n";所以这里引用它们的时候,我们在他们前面添加了两个符号,@代表这是一个数组,$代表着是一个二次引用。
     print "in subroutine:j="."@$j\n";
        print "In subroutine:the third element is $$j[2]\n";#当引用数组中的一个元素的时候第一个$和后面的j[2]代表数组中的第三个元素,而第二个$代表的就是二次引用
     #这里我们对@_的处理用pop,和shift来进行
     push(@$i,'4');
     shift(@$j);
    }


    结果如下:
    复制代码 代码如下:

    F:\&;perl\a.pl
    In main program before calling subroutine:i=1 2 3
    In main program before calling subroutine:j=a b c
    In subroutine:i=1 2 3
    in subroutine:j=a b c
    In subroutine:the third element is c
    In main program after calling subroutine:i=1 2 3 4
    In main program after calling subroutine:j=b c
    F:\&;

    我们可以观察最后的结果,
    在调用了子程序以后@i的值发生了变化:i=1 2 3 4 而j=b c。也就是说我们在子程序中对数组进行的push和shift操作在主程序中起了作用。
    为什么会出现这种情况呢?
    一般来说,我们在子程序中对变量进行了my声明,也就是只会在子程序中起作用,而不会改变主程序中的值。
    在这里由于引用的是真实的参数,也就是主程序中的值,而不是它的备份,所以会得到相应的改变。

    上一篇:perl实现blog备份的脚本代码
    下一篇:perl 指定长度并生成一个随机的DNA序列的脚本代码
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    perl中子程序中参数的两种引用(传递)方式介绍 perl,中,子程序,参数,的,