这里主要讨论的是当你要传递的参数不是仅仅一个的时候,也就是两个以上,并且他们数据的类型还不一致的时候,我们要遇到的问题:

下面是一个例子:

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 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.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 cF:\>

我们可以观察最后的结果,

在调用了子程序以后@i的值发生了变化:i=1 2 3 4 而j=b c。也就是说我们在子程序中对数组进行的push和shift操作在主程序中起了作用。

为什么会出现这种情况呢?

一般来说,我们在子程序中对变量进行了my声明,也就是只会在子程序中起作用,而不会改变主程序中的值。

在这里由于引用的是真实的参数,也就是主程序中的值,而不是它的备份,所以会得到相应的改变。

perl中子程序中参数的两种引用(传递)方式:pass by value and pass by Reference(传入引用)相关推荐

  1. PMSM中常用的两种坐标变换——两种参数的由来

    Xiaoxiaodawei 摘要: 前两期介绍了Clarke的Park变化的基本原理,但是经过这两种变换后会存在两种系数,相信大家都很迷惑,这是什么原因?主要原因是存在两种遵循的方式:1.变换前后电流 ...

  2. Spring中IoC两种接口和两种依赖注入方式的比较

    spring是一个开源框架,是为了解决企业应用程序开发的复杂性而创建的,为J2EE应用程序开发提供集成的框架.简单来说,spring是一个轻量级的控制反转IOC和面向切面AOP的容器框架.spring ...

  3. 【Spring】Spring中AOP解析 上 两种动态代理方式与ProxyFactory代理工厂

    1.两种动态代理方式演示 1.1 JDK动态代理 JDK的动态代理,就是在程序运行的过程中,根据被代理的接口来动态生成代理类的class文件,并加载运行的过程.要求被代理类必须实现一个接口 . 如下案 ...

  4. python命令行模式怎么输入_python获得命令行输入的参数的两种方式

    外部直接执行python文件时,我们有时需要获得命令行的参数6ok免费资源网 获得命令行参数的两种方式6ok免费资源网 1.通过sys.argv6ok免费资源网 sys.argv:获得一个参数列表,第 ...

  5. JSP中include的两种方法

      一.JSP中include的两种方法 1.include指令: 1 <%@include file="文件的绝对路径或者相对路径"%> file属性是必填的(绝对或 ...

  6. 在c语言程序设计中函数有两种类型 和,在C语言程序设计中函数有两种类型:__________和__________...

    在C语言程序设计中函数有两种类型:__________和__________ 以下程序的输出结果是()intA:6B:3C:2D:1 红楼梦中提到的名菜有A:酒酿清蒸鸭子B:奶油松瓤卷酥C:四喜丸子D ...

  7. C语言边沿触发函数,边沿触发在Verilog中又分为两种-Read.PPT

    技术廖义奎第章编程基础本次课内容过程赋值行为描述过程中并没有进程的概念但却有与进程相同功能的三种过程分别是和模块实例这三种在执行的方式上与进程一样在过程之间是并行执行的模块实例已在前面介绍过将在赋值一 ...

  8. Java中两种抛出异常的方式

    Java中两种抛出异常的方式 在Java中有两种抛出异常的方式,一种是throw,直接抛出异常,另一种是throws,间接抛出异常. 直接抛出异常是在方法中用关键字throw引发明确的异常.当thro ...

  9. vuejs中组件的两种不同的编写风格-选项式API及组合式API

    前言 随着vue3的逐渐稳定,以及周边生态的完善,现在vue3已经成为默认的使用方式了的 所以,对于一个前端开发者,Vue2与Vue3都得要会,在vue3中新增很多东西,比如:Fragment,Tel ...

最新文章

  1. Vue全局路由侦听beforeEach路由守卫附代码使用示例
  2. Java学生宿舍管理系统,即将毕业的兄弟有福了!
  3. H3C设备之RIP v2认证
  4. 选红叶家装不就得了,用得着这么费事吗?!
  5. 数字图像处理:第五章 代数运算
  6. 解决pip异常:No module named ‘pip‘
  7. sweetalert使用随笔
  8. 用C语言实现回调函数
  9. SpringMVC+MyBatis整合——事务管理
  10. 漆桂林:多模态知识图谱种类及其应用
  11. 【PyTorch】深度学习实践之 CNN基础篇——卷积神经网络跑Minst数据集
  12. 图片类word报告生成器
  13. linux bridge - mac和vlan转发
  14. 【花雕动手做】有趣好玩的音乐可视化系列项目(27)--磁搅LED水旋灯
  15. netty系列之:请netty再爱UDT一次
  16. 简单的PPO算法笔记
  17. com.android.camera.action.CROP照片剪辑的问题
  18. html+css实战144-banner-精品推荐-内容
  19. css文字大小fontsize,字体大小:font-size - CSS | 绿叶学习网
  20. jar包、class文件批量反编译并解压

热门文章

  1. java 大小写匹配_大写字母的Java正则表达式
  2. matlab compiler使用,安装和使用MatlabCompilerRuntime
  3. 在Linux上搭建私有云
  4. 文献阅读:SimCSE:Simple Contrastive Learning of Sentence Embeddings
  5. 计算机上的be无法正常启动,应用程序无法正常启动0xc0000005的三种解决方法
  6. 仿淘宝关闭二维码案例
  7. 记录一下手把手教您做电商网站
  8. Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之Understanding Rasa Deployments Premade Rasa Containers
  9. SCI 论文投稿之投稿信(Cover Letter)写法--附真实案例
  10. 看你骨骼清奇,老夫决定赐你这份“2018软件测试发光秘籍”