首页 > 编程 > Perl > 正文

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

2020-06-04 20:31:03
字体:
来源:转载
供稿:网友

下面是一个例子:
代码如下:
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来进行

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表