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

所属分类: 脚本专栏 / perl 阅读数: 1928
收藏 0 赞 0 分享

下面是一个例子:

复制代码 代码如下:

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子程序的运用及子程序中变量私有(my)声明的重要性

perl中的my可以来定义私有变量,可以在很多情况下防止错误的发生
收藏 0 赞 0 分享

perl push的用法及子程序返回值的反思

以下的程序,输出一串数字中比平均值大的数,其中有两个问题值得注意,具体请看程序中的注释
收藏 0 赞 0 分享

perl pop push shift unshift实例介绍

perl的pop跟push操作数组的最右边,shift跟unshift操作数组的最左边
收藏 0 赞 0 分享

perl ping检测功能脚本代码

领导有任务,给一批IP列表,ping每一台机器,如果没有响应就发邮件通知,通知的邮件需要分开,不能通知一个列表,得一封一封的通知
收藏 0 赞 0 分享

一行代码解决 perl输入 排序 输出问题

一行代码解决 perl输入 排序 输出问题,需要的朋友可以参考下
收藏 0 赞 0 分享

perl中chomp的使用介绍(chop和chomp函数区别)

perl程序中,有时在输入过程中使用chomp才会得到正确的结果
收藏 0 赞 0 分享

Perl中chomp和chop的区别介绍

chomp是用来删除换行符,chop是用来删除最后一个字符
收藏 0 赞 0 分享

Linux/Unix下安装Perl模块的两种方法分享

Linux/Unix下安装Perl模块有两种方法:手工安装和自动安装。一是从CPAN上下载需要的模块,手工编译、安装。二是联上internet,使用一个叫做CPAN的模块自动完成下载、编译、安装的全过程
收藏 0 赞 0 分享

perl比较两个文件字符串的实例代码

perl比较两个文件字符串的例子,供大家学习参考
收藏 0 赞 0 分享

perl获取日期与时间的实例代码

perl获取日期与时间的例子,供大家学习参考
收藏 0 赞 0 分享
查看更多