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声明,也就是只会在⼦程序中起作⽤,⽽不会改变主程序中的值。
在这⾥由于引⽤的是真实的参数,也就是主程序中的值,⽽不是它的备份,所以会得到相应的改变。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。