Perl 中的引用,为什么要使用引用?

对于熟悉C语言的开发人员来说, 指针这个概念一定不陌生。

Perl 的引用就是指针,能够指向变量、数组、哈希表甚至子程序。

Perl5中的两种Perl引用类型为硬Perl引用和符号Perl引用。符号Perl引用含有变量的名字,它对执行时创建变量名并定位非常实用,基本上,符号Perl引用就象文件名称或UNIX系统中的软链接。而硬Perl引用则象文件系统中的硬链接。

Perl4仅仅同意符号Perl引用,给使用造成一些困难。比如,仅仅同意通过名字对包的符号名哈希表(名为_main{})建立索引。Perl5则同意数据的硬Perl引用,方便多了。

硬Perl引用跟踪Perl引用的计数,当其数为零时。Perl自己主动将被Perl引用的项目释放,假设该项目是对象。则析构释放到内存池中。

Perl本身就是个面向对象的语言。由于Perl中的不论什么东西都是对象。包和模块使得对象更易于使用。

那在什么状况下会使用到引用呢?

在perl4中,hash表中的value字段仅仅能是scalar,而不能是list,这对于有些情况是非常不方便的,比方有以下的数据:

Chicago, USA
Frankfurt, Germany
Berlin, Germany
Washington, USA
Helsinki, Finland
New York, USA

我们想要按国家将城市分类。每一个国家后面相应城市列表,假设用perl4来做,必须将城市列表组合成字符串才行,假设用perl5就能够用引用来做。有了引用。就能够构造复杂的hash结构。就能够用列表作为hash的值了。

定义引用

知道了引用的作用。那么怎样来定义一个引用呢?

方法1: 使用斜线  \

在变量前面加上一个 \

对于数组变量的引用:

my @array = (1,2,3);
my $arrayref = \@array;

对于哈希变量的引用

my %hash = ("name"=>"oscar999","age"=>30);
my $hashref = \%hash;

对于标量的引用

my $scarlar = 1;
my $scarlarfef = \$scarlar;

方法2. 匿名引用  []  或 {}

匿名引用就是不定义变量,

对于匿名数组来说,直接用中括号 [] 来定义引用

my $arrayref = [1,2,3];

以上就是定义一个匿名数组。

使用这样的方式也能够在匿名数组中套匿名数组

my $arrayref = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];

匿名哈希引用用 {} 定义

my $href = {US=>4,CN=>6};

使用引用

定义了引用。 怎样使用呢?

方法1:  与普通变量訪问相比。 多加一个 $

这个概念和C 和相似

#定义变量
my $scalar = 1 ;
my @array = (1, 2, 3) ;
my %hash = ("name"=>"oscar999","age"=>30); #定义引用
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[2], "\n" ;
print $$href{'name'}, "\n" ;

方法2  与普通变量訪问相比。 多加一个 $

数组的使用:

   @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。只是最好是加上{}。

方法3: 使用箭头符号 -> 这样的使用方法看起来比較简洁

$aref->[]  数组解引用

$href->{}  哈希解引用

$href->()  子过程解引用

看看样例:

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

前言

[Perl系列—] 2. Perl 中的引用使用方法的更多相关文章

  1. 错误 1 error LNK2019: 无法解析的外部符号 __imp__pthread_create,该符号在函数 _main 中被引用 解决方法

    晚上花几分钟在windows下测了下pthread的用法,出现错误 1 error LNK2019: 无法解析的外部符号 __imp__pthread_create,该符号在函数 _main 中被引用 ...

  2. 如何在JavaScript中正确引用某个方法(bind方法的应用)

    在JavaScript中,方法往往涉及到上下文,也就是this,因此往往不能直接引用,就拿最常见的console.log("info…")来说,避免书写冗长的console,直接用 ...

  3. 关于“无法解析的外部符号”和“该符号在函数_wmain 中被引用”的问题

    在VS2008和opendv的环境下: error LNK2019: 无法解析的外部符号_cvDestroyWindow,该符号在函数_wmain 中被引用 error LNK2019: 无法解析的外 ...

  4. error LNK2019: 无法解析的外部符号 __imp_recv,该符号在函数 evthread_notify_drain_default 中被引用

    在Windows系统中使用libevent时,编译报错:error LNK2019: 无法解析的外部符号 __imp_recv,该符号在函数 evthread_notify_drain_default ...

  5. 【转载】Perl中的引用

    为什么使用引用? 在perl4中,hash表中的value字段只能是scalar,而不能是list,这对于有些情况是很不方便的,比如有下面的数据: Chicago, USAFrankfurt, Ger ...

  6. perl 中的引用

    perl 语言中的引用共分为两类: 声明引用时只需要在对象的前面加上反斜杠 第一列是数组的引用: 代码示例: , , ); my $array_ref = \@array; 第二种是哈希的引用 代码示 ...

  7. Perl系列文章

    0.Perl书籍推荐 Perl书籍下载 密码:kkqx 下面是一些我学习Perl过程中读过完整的或部分章节的觉得好的书. 入门级别1:<Perl语言入门>即小骆驼 入门级别2:<In ...

  8. PHP-之POSIX系列函数和兼容Perl系列函数比较

    PHP有两种正则系列函数 POSIX 系列和兼容Perl系列的函数 在PHP大于5.3使用POSIX系列函数会报E_DEPRECATED 错误, POSIX系列函数在大于5.3版本不建议使用,PHP7 ...

  9. [码海拾贝 之Perl]在字符串数组中查找特定的字符串是否存在

    前言 检索一个字符串是否存在于一个数组中, 最主要的想法应该就是对数组进行循环, 逐个推断数组的每一个元素值和给定的值是否相等. (在Java语言还能够把数组转成 List , 在 list 中直接有 ...

随机推荐

  1. java分页之假分页

    假分页,顾名思义,不是真正的在数据库里进行过滤,而是从数据库查询之后,取得全部结果,在展现的时候做些手脚. import java.util.ArrayList; import java.util.L ...

  2. COGS——T 438. 烦人的幻灯片

    http://www.cogs.pro/cogs/problem/problem.php?pid=438 ★☆   输入文件:slides.in   输出文件:slides.out   简单对比时间限 ...

  3. Nginx +Tomcat 实现动静态分离(转)

    Nginx +Tomcat 实现动静态分离 动静态分离就是Nginx处理客户端的请求的静态页面(html页面)或者图片,Tomcat处理客户端请求的动态页面(jsp页面),因为Nginx处理的静态页面 ...

  4. 代理模式之cglib动态代理

    上一篇博客说了实现InvocationHandler接口的jdk动态代理,还有一种实现动态代理的方式则是:通过继承的方式实现的cglib动态代理. 先在程序中导入cglib的包,cglib-nodep ...

  5. 对象不支持“abigimage”属性或方法

    在一个网页中用了一个js插件, js文件引用的没有错,代码也和demo差点儿相同,  可是执行时ie的调试工具报了一个错: 解决方式: jquery文件冲突,发现原来自己引过一个 <script ...

  6. 四种GCC内置位运算函数

    int __builtin_ffs (unsigned int x) 返回x的最后一位1的是从后向前第几位,比方7368(1110011001000)返回4. int __builtin_clz (u ...

  7. 37、ifconfig命令

    很多windows很熟悉ipconfig命令行工具.它被用来获取网络接口配置信息并对此进行改动.Linux系统拥有一个类似的工具,也就是ifconfig(interfaces config). 通常须 ...

  8. MongoDB数据修改案例

    数据更新操作 队友MongoDB而言,数据更新是一件非常麻烦的事情.Mongo通常会存副本数据,数据有变更的时候,最好的做法是删除MongoDB的数据,重新插入. Mongo中提供了两个函数,一个是s ...

  9. 如何让Java写的程序,脱离Eclipse在别人的电脑上运行?

    Java程序运行,离不开JRE. 将JRE文件夹拷贝出来, 将编写程序的bin文件夹拷贝出来, 再编写一个bat文件. start jre\bin\javaw.exe -cp .\bin\ -Djav ...

  10. JavaScript中Number常用属性和方法

    title: JavaScript中Number常用属性和方法 toc: false date: 2018-10-13 12:31:42 Number.MAX_VALUE--1.79769313486 ...