Perl-12---引用

一、引用的概念:

Perl中提供了一种类似于C/C++语言中的指针功能的数据类型,名叫引用;这个引用与C++中的引用的概念不一样,但是效果一样;Perl中的引用就是指针,它用于跟踪变量在内存中的地址,可以跟踪简单的标量变量、数组变量、哈希变量、文件句柄变量,甚至还可以跟踪子程序;引用存放的是某个变量在内存中的地址,这对于跟踪大型的数据对象是很有用的;引用也是一种数据类型,这种类型的变量叫做引用变量,引用变量中存放的是内存地址,而不论被引用的数据对象是何种类型的数据对象,不论被引用的数据对象所占用的内存空间有多大,引用变量中存放的总是被引用的数据对象的内存地址;内存地址是个无符号的整数,所以引用型变量总是一个简单的标量变量,与其它普通的标量变量的使用方法完全相同;

如果在程序中使用了引用,那么,Perl解释器不再通过变量的名字来调用变量的值,而是是通过引用变量中所存放的内存地址来调用变量的值;

总之,引用变量可以跟踪变量在内存中的地址,它可以跟踪任何类型的变量;引用变量总是一个标量,用于存放另一对像在内存中的地址,引用变量之占用内存中的一个地址空间,而无论存放的是一个标量变量的地址还是存放其它大对象的内存地址;

二、引用的使用:

如果标量变量$Pointer中存放的是一个数组的地址,那么,在访问数组元素的时候,要先提取数组的地址,然后 再通过地址来访问数组中的元素;如:可以通过形式“@$Pointer ”来访问数组中的元素;形式“@$Pointer  ”的意义为:取出$Pointer中存放的地址作为数组使用;类似地,如果$Pointer中存放的是某个哈希变量的地址,那么可以通过形式“%$Pointer  ”来访问哈希变量中的元素;

三、常见数据类型的引用定义:

数据类型          定义            举例

标量变量           /$Var                              $Pointer  =  /$Var

数组                  /@Array                          $Pointer  =  /@Array

哈希变量           /%Hash                           $Pointer  =  /%Hash

文件句柄           /*FILEHANDLE                $Pointer  =  /

常量                  /常量                               $Pointer  =  /3.1415926

子程序              /&SubRoutine                  $Pointer  =  /&SubRoutine

匿名数组           [ LIST ]                            $Pointer  =  [ “Smith”,“Jack”,“Jimmy”,“ZhaZha”]

匿名哈希变量    { Key=>Value }                $Pointer  = { Key1=>Value1,Key2=>Value2}

匿名子程序       sub {}                               $Pointer  =  sub { printf( “Hello,Perl World/n”);}

对象引用           bless  $self;

四、引用变量的类型:

1、粗略地分,可以分为硬引用符号引用;符号引用中包含变量的名字,符号引用就类似与文件名或操作系统的软连接,而硬引用则类似与操作系统中的硬连接;硬引用跟踪引用的计数,当引用计数为0时,Perl自动将被引用的项目所占用的内存释放掉;如果被引用的项目是某个类的对象,那么Perl在释放该对象时会自动调用该对象的析够函数,以释放其内存;Perl本身就是一个面向对象的语言,Perl中的一切都是对象,而包和模块是对象更易于使用;

2、如果按照引用变量中所存放的地址类型来分,引用变量可以分为6种类型:

★ 直接引用型变量:顾名思义,直接引用变量保存了其它变量的地址,包括标量、数组变量、哈希变量、文件句柄变量以及其它类型的变量;直接引用变量可以修改被引用的变量的值,引用变量中的地址值也可以被修改;直接引用变量使用反斜杠“/”来定义;

对于数组和哈希变量的直接引用可以这样定义:

  $lpArray  =  /@Array;#$lpArray存放了数组@Array的首地址,$lpArray代表数组名;

   此时数组元素的访问方式有:$lpArray->[$Index]  或  $$lpArray[$Index]  或  ${$lpArray}[$Index];

  $lpHash  = /%Hash; #$lpHash存放了哈希变量%Hash的首地址,$lpHash代表哈希变量的名称;

  此时哈希变量的元素的访问方式有:$lpHash->{$key}  或  $$lpHash{$key}  或 ${$lpHash}{$key};

★ 常量引用型变量:它引用的是直接数,而不是变量;也使用反斜杠“/”定义;常量引用变量所保存的地址值可以被修改,但是被引用的常量值是不能被修改的,因为被引用的是常量;它的存储方式决定了它是被存放再一块受保护的内存空间中的;

★ 子程序引用型变量:它是直接引用变量和常量引用变量的混合;子程序引用变量不能用来修改子程序引用变量所指向的子程序,但是子程序本身是可以被修改的;生成子程序引用型变量时,必须使用位与运算符“&”来定义所引用的是子程序而不是直接数;

★ 符号引用型变量:符号引用型变量是包含另一个变量的直接数名称的变量;Perl中使用反斜杠“/”和变量名称来定义引用符号;

★ 匿名引用型变量:匿名引用变量可以生成不命名的对象引用,这些对象也被成为是孤立的对象;匿名引用有匿名数组、匿名哈希变量和匿名子程序;分别使用运算符“[]”、“{}”和  "sub {}”。匿名引用运算符的使用是上下文相关的,只在给标量变量赋值的时候才生成引用。匿名子程序运算符要求在子程序定义内用分号结尾;Perl把匿名引用变量当作在内存地址中有特定地址的语句;

★ 对象引用变量:对象引用变量就是匿名哈希变量引用的一个典型应用;Perl中使用bless操作符来专门处理这类引用,可以生成引用对象与生成对象的类之间的连接;

五、间接引用:

访问引用所指向的变量的值,称为间接引用;要取得内存中引用变量最终所指向的数值,就必须告诉Perl解释器查找作为数值容器的引用变量所保存的内存地址;实际情况是这样的,Perl中的每一个“$”符号就是一个数值容器,Perl解释器从右到左,或从内到外来顺序地解释每一个“$”符号。每次遇到“$”符号时,都会把$右边的对象作为一个数值容器,比如:$$Pointer,Perl就会把Pointer当作一个数值容器,从右边第一个$开始取得对象Pointer中存放的地址,当遇到左边的$时,又会把$Pointer当作一个数值容器,而$Pointer中存放的时地址,左边的$表示一个数值容器,所以${$Pointer}就取到了引用变量所指对像中保存的数值内容了;

注意:指针就是地址,通过指针可以访问到该地址处所存放的数据;如果指针指向了无效的内存地址,就会得到不正确的数据,通常情况下,Perl会返回null值,但是并不依赖于此,一定要在程序中正确地初始化所有的指针,使之指向有效的数据项;

六、匿名数组和匿名哈希变量:

匿名数组: $lpArray  =  [1,2,"A","B",(4 .. 10),[12 .. 20]];

匿名哈希变量:$lpHash  =  {Key1=>Value1,Key2=>Value2,Key3=>Value3,....,KeyN=>ValueN};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值