时间:2021-05-22
下面是一个例子:
复制代码 代码如下:
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声明,也就是只会在子程序中起作用,而不会改变主程序中的值。
在这里由于引用的是真实的参数,也就是主程序中的值,而不是它的备份,所以会得到相应的改变。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言在c++中参数传递有两种形式:值传递和引用传递。这两种方式的区别我不在此说,自行补上,如果你不知道的话。我先上python代码,看完我们总结一下,代码如下:
在C/C++中,传值和传引用是函数参数传递的两种方式,在Python中参数是如何传递的?回答这个问题前,不如先来看两段代码。代码段1:deffoo(arg):a
C/C++函数参数传递机制详解及实例概要:C/C++的基本参数传递机制有两种:值传递和引用传递,我们分别来看一下这两种的区别。(1)值传递过程中,需在堆栈中开辟
本文实例讲述了Java方法的参数传递机制。分享给大家供大家参考,具体如下:参数传递机制对于程序设计语言来说,一般方法(函数)的参数传递有两种:按值传递和按引用传
参数传递,是在程序运行过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程。参数传递有3种方式:值传递地址传递引用传递tip