Perl 引用
引用就是指针,Perl 引用是一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方。

1、创建引用
1.使用斜线\
定义变量的时候,在变量名前面加个\,就得到了这个变量的一个引用。
比如:
# 数组的引用
my@array= (1,2,3) ;
my$aref=\@array ;

#哈希的引用
my%hash= ("name"=>"zdd","age"=>30,"gender"=>"male") ;
my$href=\%hash ;

#标量的引用
my$scalar=1 ;
my$sref=\$scalar ;

2.匿名引用(很常用)
2.1匿名数组引用-用[]定义。
$aref= [ 1,"foo",undef,13 ];

2.2匿名数组的元素仍然可以是匿名数组,所以我们可以用这种方法构造数组的数组,可以构造任意维度的数组。
my $aref = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
]

2.3匿名哈希引用-用{}定义。
$href= { APR =>4, AUG =>8 };

2、使用引用
1.与普通变量的访问方法相比,假设原来的变量名是name,则现在用$name来代替name。

my $scalar =  ;
my @array = (, , ) ;
my %hash = (, ) ;

my $sref = \$scalar ;   # scalar reference
my $aref = \@array ;    # array reference
my $href = \%hash ;     # hash reference

# 方法一
print $$sref, "\n" ;  # 用$sref代替sref
print @$aref, "\n" ;   # 用$aref代替aref
print %$href, "\n" ;   # 用$href代替href
print $$aref[], "\n" ;
print $$href{'zdd'}, "\n" ;

2.与普通变量的访问方法相比,假设变量原来的名字是name,则现在用{$name}来代替name。
数组引用的使用方法如下
   @a          @{$aref}            An array
   reverse@a           reverse @{$aref}            Reverse the array
   $a[3]             ${$aref}[3]             An element of the array
   $a[3] =17;                  ${$aref}[3] =17              Assigning an element

同理,哈希引用的使用方法如下
   %h           %{$href}            A hash
   keys%h      keys%{$href}            Get the keys from the hash
   $h{'red'}             ${$href}{'red'}               An element of the hash
   $h{'red'} =17           ${$href}{'red'} =17                Assigning an element

注意:当{}内部是$var的形式时,{}是可以省略的,也就是说@{$aref}等价于@$aref,不过初学最好养成使用{}的习惯。

my $scalar =  ;
my @array = (, , ) ;
my %hash = (, ) ;

my $sref = \$scalar ;   # scalar reference
my $aref = \@array ;    # array reference
my $href = \%hash ;     # hash reference

print ${$sref}, "\n" ;
print @{$aref}, "\n" ;
print %{$href}, "\n" ;
print ${$aref}[], "\n" ;
print ${$href}{'zdd'}, "\n" ;

3.前两种方法比较繁琐,这种很简洁,就是使用箭头符号->。
$aref->[]  数组解引用
$href->{}  哈希解引用
$href->()  子过程解引用

$aref->[0] =3 ;
$href->{name} ="autumn" ;
$sref=2 ;

也可以将引用赋值给其他变量
my$aref1=$aref ;
my$href1=$href ;
my$scalar1=$scalar ;

my $scalar =  ;
my @array = (, , ) ;
my %hash = (, ) ;

my $sref = \$scalar ;   # scalar reference
my $aref = \@array ;    # array reference
my $href = \%hash ;     # hash reference

# 方法三,不适用于标量
print $aref->[], "\n" ;
print $href->{'zdd'}, "\n" ;

4.数组的数组
@a = (
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
)
我们知道[1, 2, 3]定义了一个(1, 2, 3)的匿名引用,所以数组a实际上包含三个元素,每个元素是一个引用,该引用指向一个数组,所以我们可以用下面的方法来访问数组元素(注意,下标从0开始)。

my $aref = [, [, ], [, , ]] ;
print $aref->[] ,
print $aref->[][],
print $aref->[][], 

5.哈希的哈希

my $student_properties_of = {
    'zdd' => {
        ,
        ,
        ',
    },

    'autumn' => {
        ,
        ,
        ',
    }
} ;

3、引用的赋值
$aref2 = $aref1; 将使得$aref2和$aref1指向同一个数组,如果想将$aref1指向的数组拷贝一份给$aref2的话,使用 $aref2 = [@{$aref1}] 方法,[]里面对数组进行解引用,而[]以解引用后的数组为内容生成了一个新的匿名数组,又赋值给$aref2。
注意:不能使用 $aref2 = @{$aref1} 的形式,外层的[]是不可缺少的。由于=左边是标量,所以右边的数组会被解释为标量环境,得到的是数组元素个数,而不是元素本身。但是如果加上[]就可以了,这样perl知道这是一个匿名数组的赋值。

4、判断一个变量是否是引用
使用ref函数即可,如果变量是引用则返回真,否则返回假。实际上它更智能,它会返回引用对应的类型,比如HASH或者ARRAY。

my $aref1 = [, , ] ;
print ref $aref1, "\n" ;         #输出 ARRAY
if (ref $aref1) {
    print "true\n" ;                 #输出 true
}

5、判断两个引用是否指向同一个目标
可以用eq,这将以字符串的形式判断,也可以使用== 。

my $aref1 = [, , ] ;
my $aref2 = $aref1 ;

print $aref1, "\n" ;
print $aref2, "\n" ;

if ($aref1 eq $aref2) {
    print "reference equal\n" ;
}
if($aref1 == $aref2) {
    print "reference equal\n" ;
}

产生如下输出:
ARRAY(0x248bec)
ARRAY(0x248bec)
reference equal (eq)
reference equal (==)

Perl 引用:引用就是指针,Perl 引用是一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至子程序。的更多相关文章

  1. c++值传递,指针传递,引用传递以及指针与引用的区别

    值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影 ...

  2. C++学习笔记 指针与引用

    指针与引用  1. 指针 (1) 指针是一个变量(实体),存储的是一个地址,指向内存的一个存储单元,指针可以为空 (2) 指针可以为空,在声明定义时可以不初始化 (3) 指针在初始化之后可以重新指向其 ...

  3. C++ 中指针与引用的区别

    指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过v ...

  4. 指针和引用的区别(c/c++)

      http://blog.csdn.net/thisispan/article/details/7456169 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用 ...

  5. C++指针和引用

     ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名.  ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指 ...

  6. 【C++自我精讲】基础系列一 指针与引用

    [C++自我精讲]基础系列一 指针与引用   一 前言   指针.引用.指针与引用区别. 二 指针   变量:代码中常常通过定义变量来申请并命名存储空间,并通过变量的名字来使用这段存储空间. //变量 ...

  7. 转 浅谈C++中指针和引用的区别

    浅谈C++中指针和引用的区别 浅谈C++中指针和引用的区别   指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性 ...

  8. C++中引用传递与指针传递区别

    C++中引用传递与指针传递区别 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程 ...

  9. 解决老大难疑惑:指针 vs 引用

    ▶疑问描述 1.  引用reference的本质: 常指针 ——> 什么时候用指针?= 就按Java中的引用变量那样用? ——> 什么时候用引用?  ①函数的入参/返回值时   ②T&am ...

随机推荐

  1. 文件上传 jqueryForm

    关于formData方式ajax上传文件的方式在笔者随笔开发日记5-18中有描述,在此不做记录. 由于之前使用的是formData方式上传文件,但是在后期处理浏览器兼容问题的时候出现头痛的事情,for ...

  2. Mybatis新增返回主键的两种方法 (mysql)

    1.自增:LAST_INSERT_ID (自动返回最后一个INSERT或 UPDATE 问询为 AUTO_INCREMENT列设置的第一个 发生的值.) <!-- mysql的自增ID :LAS ...

  3. 什么是YARN

    YARN的核心组件: 1)ResourceManager,扮演Master角色(和HDFS的nameNode很像)主要用于资源分配:RM有两个子组件,分别是Scheduler(Capacity Sch ...

  4. 坑爹的AMH

    坑爹的 AMH的配置文件在这里: nginx 配置文件1:/usr/local/nginx-generic-1.6/conf/nginx.conf nginx 配置文件2:/home/wwwroot/ ...

  5. Python——你应该知道这些

    1. Python的出生 1989年 Guido van Rossum开始编写Python语言编辑器(龟叔为了打发无聊的圣诞节) 1991年 第一个Python编译器诞生(正式诞生) 1994年 Py ...

  6. Android 使用adb查看和修改电池信息

    1.获取电池信息 $ adb shell dumpsys battery $ adb shell dumpsys battery Current Battery Service state: AC p ...

  7. struts2学习(15)struts2防重复提交

    一.重复提交的例子: 模拟一种情况,存在延时啊,系统比较繁忙啊啥的. 模拟延迟5s钟,用户点了一次提交,又点了一次提交,例子中模拟这种情况: 这样会造成重复提交:   com.cy.action.St ...

  8. ping正常但是ssh到linux服务器很卡的解决方法

    ssh登录很慢的问题  1.关闭ssh DNS反向解析 vi /etc/ssh/sshd_config 修改UseDNS no 2.关闭 GSSAPI 的用户认证   vi /etc/ssh/sshd ...

  9. WordSmith2013-7-31

    WordSmith Good Evening Ladies and Gentlemen,I’am Jason,I’m pleasured  to be wordsmith tonight. First ...

  10. sqlldr并发

    sage: SQLLDR keyword=value [,keyword=value,...]   部分关键字:     userid -- ORACLE username/password    c ...