引用详解

一、定义引用有两种:

        1、用斜线“\”

        2、匿名引用

1、用反斜线的引用:数组、哈希、标量

  数组的引用

    my @array = (1,2,3);

    my $aref = \@array;

  哈希的引用:

    my %hash = ("wo"=>"women","ni"=>"nimen");

    my $href = \%hash;

  标量的引用:

    my $scalar = 1;

    my $scalarrrr= \$scalar;

2、使用匿名引用:

匿名数组引用:要用中括号:"[]"

        $aref = [1,"we","ig",undef,809];

匿名哈希引用:要用大括号:"{}"

        $href = {we=>1,ig=>2};

二、使用引用:

1、第一种方法:

定义了就该使用了,被引用的是什么类型的,显示的时候就需要加上什么样的符号,如数据要在前面加上@

my $scalar = 1 ;
my @array = (1, 2, 3) ;
my %hash = ('zdd' => 30, 'autumn' => 27) ; 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[2], "\n" ;
print $$href{'zdd'}, "\n" ; 2、第二种方法 与普通变量的访问方法相比,假设变量原来的名字是name,则现在用{$name}来代替name。
@a     等同于    @{$aref}     #用其实很简单,就是很容易混淆        
reverse@a  等同于  reverse @{$aref}      #需要反复记忆,才能活学活用
$a[3]    等同于    ${$aref}[3]        #记不住的话可能看代码都会蒙圈

$a[3] =17;   等同于    ${$aref}[3] =17     #我现在也没记住呢

同理,哈希引用的使用方法如下。

%h      等同于    %{$href}         
keys%h    等同于      keys%{$href}  
    
$h{'red'}   等同于      ${$href}{'red'}   
  
$h{'red'} =17   等同于    ${$href}{'red'} =17  
3、第三种方法:不适用于标量
前两种很繁琐,第三种会很简洁,使用箭头符号:"->",一定注意这个箭头后面的括号是啥,数组要用中,哈希用大
$aref->[]     #数组解引用
$href->{}     #哈希解引用
$href->()     #子过程解引用
举个栗子:
$aref->[0] = 3;
$href->{name} = "autumn";    三、实战分析
看一下这些玩意到底是什么玩意 先看正常的数组是怎么定义和访问的: @a = ([1, 2, 3],[4, 5, 6],[7, 8, 9])
#定义一个二维数组
 #我们知道[1, 2, 3]定义了一个(1, 2, 3)的匿名引用,所以数组a实际上
 #包含三个元素,每个元素是一个引用,该引用指向一个数组,所以我们可以
 #用下面的方法来访问数组元素(注意,下标从0开始) 多维数组的另一个写法如下:
my $aref = [1, [2, 3], [4, 5, 6]] ;
print $aref->[0] , "\n" ;        #输出1
print $aref->[1][1], "\n" ;       #输出3
print $aref->[2][0], "\n" ;       #输出4

这两者的区别有以下几点:

  • 前者是真正的数组,所以定义变量是使用@,后者是指向匿名数组的引用,所以定义的时候使用$
  • 前者的数组元素是匿名数组,而外层数组则是实体数组,后者无论元素还是外层数组都是匿名数组
  • 前者可以用$a[x][y]的形式访问,而后者只能用解引用的方式访问,即$a->[x][y]的形式。

四、说一说引用的赋值

$aref1 = $aref2     #使得这两个东西,也就是$aref1和$aref2,指向同一个数组

蛋是,你现在想把$aref1指向的那个数组拷贝一份给$aref2的话,使用这种方法:

       $aref2 = [@{$aref1}];  #在中括号里面进行解引用,而中括号以解引用后的数组为内容

                     #生成了一个新的匿名数组,赋值给$aref2

注意:不能不加中括号,由于等号左边是标量,等号右边的数组会被解释为标量环境,

   所以最后$aref2得到的是数组元素个数,而不是元素本身

   但加上中括号就可以了,perl会知道这个是一个匿名数组的赋值

  $aref2 = @{$aref1};     #得到的会是元素个数,而不是数组本身

五、判断一个变量是否是引用
使用ref函数就可以,如果变量是引用就返回TRUE,否则为假。实际上他还会返回引用对象的类型,比如HASH或者ARRAY
    my $aref1 = [1,2,0];
    print ref #aref1;      #返回ARRAY
还可以这样用:
    if (ref $aref1) {
      print "true"."\n";    #返回true
} 六、判断两个引用是否指向一同个目标

可以用eq,这将以字符串的形式判断,也可以使用==

看下面就知道是不是男人,额,不是不是,就知道是怎么用的了

看下面:

my $aref1 = [1, 2, 0] ;            
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语言--一些关于赋值、引用的东西的更多相关文章

  1. Perl语言编程(大骆驼)

    啰嗦几句 Perl的时代已经过去,现在年轻的同事们基本上都在用Python了.但个人认为单就生物信息文本处理而言,Perl语言是绝对够用的.最主要的是,前辈们搭建的流程大多数是Perl写的,因此,如果 ...

  2. Perl语言入门14-17

    ---------第十四章 字符串与排序------------------- index查找子字符串 my $stuff = "howdy world!"; my $where ...

  3. Perl语言

    Perl是高级.通用.直译式.动态的程序语言家族.最初设计者拉里·沃尔(Larry Wall)为了让在UNIX上进行报表处理的工作变得更方便,决定开发一个通用的脚本语言,而在1987年12月18日发表 ...

  4. input用法,永远等待,直到用户输入值赋值给一个东西。

    input用法,永远等待,直到用户输入值赋值给一个东西. n1 = input('请输入用户名:') n1 = input('请输入密码:') print(n1) print(n1)

  5. Perl语言——简单说明

    Perl语言——简单说明 一.简单说明 Perl语言全称:实用摘录与报表语言|病态折中式垃圾列表器.Perl名称并不是缩写词,而是个溯写字. Perl语言历史:Larry Wall(拉里·沃尔)20世 ...

  6. perl语言书籍教程推荐

    互动出版网计算机频道.为您推荐关于perl语言的书籍教程.包括perl push.perl chomp以及perl python等perl语言内容. perl语言书籍一.<Perl语言编程 第四 ...

  7. 边看MHA源码边学Perl语言之一开篇

    边看MHA源码边学Perl语言之一开篇 自我简介 先简单介绍一下自己,到目前为此我已经做了7年左右的JAVA和3年左右php开发与管理,做java时主要开发物流行业的相关软件,对台湾快递,国际快递,国 ...

  8. Perl语言入门

    Perl 是 Practical Extraction and Report Language 的缩写,可翻译为 "实用报表提取语言". Perl语法基础: (1)Perl程序由声 ...

  9. Perl语言入门: 斜线不是元字符,所以在不作为分隔符时不需要加上反斜线。

    Perl语言入门: 斜线不是元字符,所以在不作为分隔符时不需要加上反斜线.

随机推荐

  1. 转载:收费版APP三年总结(个人经验+数据图分享)

    各位朋友好,apop感觉这里的朋友有许多是以广告收入为主,所以apop来分享另外一块(收费版APP)的个人三年来的总结分享,希望对各位有帮助.首 先,其实在AppStore(或GooglePlay)上 ...

  2. Luogu P5351 Ruri Loves Maschera

    先ORZ\(Owen\)一发.感觉是个很套路的题,这里给一个蒟蒻的需要特判数据的伪\(n\log^2 n\)算法,真正的两只\(\log\)的还是去看标算吧(但这个好想好写跑不满啊) 首先这种树上路径 ...

  3. 2890: C--去掉+86

    2890: C--去掉+86 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 210  Solved: 91[Submit][Status][Web Bo ...

  4. 使用gcc -g编译,gdb调试时仍然存在“no debug symbols found”的错误

    今天为调试一段代码,使用gcc将程序用-g选项重新编译.但是使用gdb进行debug时,仍然出现“no debug symbols found”的错误.仔细检查了一下Makefile,原来后面定义的连 ...

  5. PAT (Basic Level) Practise (中文)-1029. 旧键盘(20)

    PAT (Basic Level) Practise (中文)-1029. 旧键盘(20) http://www.patest.cn/contests/pat-b-practise/1029 旧键盘上 ...

  6. javase(6)_异常

    一.异常的概念 1.java异常是Java提供的用于处理程序中错误的一种机制. 2.所谓错误是程序在运行过程中发生的一些异常事件(如:除0,数组下标越界,文件不存在等). 3.Java程序的执行过程中 ...

  7. 第五次作业:Excel制作英文课程表

    要求: 一.内外变宽线条与颜色图同,表格有底纹色彩 二.横向打印,上下左右居中,表格标题居中,表头斜线,斜线两边加文字 三.设置打开密码

  8. Spring框架bean的注解管理方法之一 使用注解生成对象

    首先在原有的jar包: 需Spring压缩包中的四个核心JAR包 beans .context.core 和expression 下载地址: https://pan.baidu.com/s/1qXLH ...

  9. passive event 解决方法

    为了让页面滚动的效果如丝般顺滑,从 chrome56 开始,在 window.document 和 body 上注册的 touchstart 和 touchmove 事件处理函数,会默认为是 pass ...

  10. Java输入几行字符串

    查找书籍 给定n本书的名称和定价,本题要求编写程序,查找并输出其中定价最高和最低的书的名称和定价. 输入格式: 输入第一行给出正整数n(<10),随后给出n本书的信息.每本书在一行中给出书名,即 ...