perl中子程序中参数的两种引用(传递)方式:pass by value and pass by Reference(传入引用)
来源:互联网 发布:数组转字符串 java 编辑:程序博客网 时间:2024/04/30 02:40
这里主要讨论的是当你要传递的参数不是仅仅一个的时候,也就是两个以上,并且他们数据的类型还不一致的时候,我们要遇到的问题:
下面是一个例子:
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.plIn main program before calling subroutine:i=1 2 3In main program before calling subroutine:j=a b cIn subroutine:i=1 2 3 a b cin subroutine:j=In main program after calling subroutine:i=1 2 3In main program after calling subroutine:j=a b cF:\>
在这个例子中,子程序中有两个参数@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.plIn main program before calling subroutine:i=1 2 3In main program before calling subroutine:j=a b cIn subroutine:i=1 2 3in subroutine:j=a b cIn subroutine:the third element is cIn main program after calling subroutine:i=1 2 3 4In main program after calling subroutine:j=b cF:\>
我们可以观察最后的结果,
在调用了子程序以后@i的值发生了变化:i=1 2 3 4 而j=b c。也就是说我们在子程序中对数组进行的push和shift操作在主程序中起了作用。
为什么会出现这种情况呢?
一般来说,我们在子程序中对变量进行了my声明,也就是只会在子程序中起作用,而不会改变主程序中的值。
在这里由于引用的是真实的参数,也就是主程序中的值,而不是它的备份,所以会得到相应的改变。
- perl中子程序中参数的两种引用(传递)方式:pass by value and pass by Reference(传入引用)
- 方法参数中pass by reference(传引用)和 pass by value(传值)的区别
- Java 只有值传递(Pass By Value),没有引用传递(Pass By Reference)
- Java中方法调用参数传递的方式是传值,尽管传的是引用的值而不是对象的值。(Does Java pass by reference or pass by value?)
- 尽量用pass-by-reference-to-const(const引用)替换pass-by-value(传值)
- perl中子程序中参数的两种引用(传递)方式介绍
- Java Pass By Value and Pass By Reference
- Pass by value & pass by reference
- pass by value & pass by reference
- pass by value vs pass by reference
- [翻译] Effective C++, 3rd Edition, Item 20: 用 pass-by-reference-to-const(传给 const 引用)取代 pass-by-value(传值)(上)
- [翻译] Effective C++, 3rd Edition, Item 20: 用 pass-by-reference-to-const(传 const 引用)取代 pass-by-value(传值)(下)
- Effective C++之Item 20: 用 pass-by-reference-to-const(传引用给 const)取代 pass-by-value(传值)
- java中参数传递详解:call by value(按值传递)和 call by reference(按引用传递)
- (小结)pass-by-reference-to-const替换pass-by-value
- PHP参数传递之引用传递及错误Fatal error: Call-time pass-by-reference has been removed解决办法
- java当中也有pass-by-value值传递或pass-by-reference地址传递吗
- 值传递(pass by value)
- 【就业】签offer和签三方协议的不同
- poj1795Median Weight Bead传递闭包
- Eclips运行时概述2
- asp.net 验证控件
- Eclips运行时概述3
- perl中子程序中参数的两种引用(传递)方式:pass by value and pass by Reference(传入引用)
- Eclips运行时概述4
- 使用Visual Studio .NET 2010的配置和条件编译在一个项目实现不同版本
- 如果回到十八岁,我要对自己说...... .
- OOA与OOD与observer(观察者模式)
- int *p1 = new int[10]; int *p2 = new int[10](); 的区别
- as86中文手册
- i = &i
- 手工构建 Mac OS APP (一)