[Perl系列—] 2. Perl 中的引用用法

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
   [email protected]      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 中的引用用法,布布扣,bubuko.com

时间: 2025-01-01 14:19:09

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

[Perl系列—] 1. 清空目录及目录中的所有文件

Perl 删除单个文件和目录 Perl 删除单个文件的语法是: unlink 举例来说, 删除 D 盘 temp 目录下的 test.txt 的写法就是: unlink "D:/temp/test.txt" 如果要删除这个目录中所有的文件的话(不包含子目录) unlink glob "D:/temp/*" Perl 删除单个目录的语法是:  rm 类似, 删除上面的temp 目录的写法就可以是: rmdir "D:/temp" 看起来很简单, 但

perl 中的引用

perl 语言中的引用共分为两类: 声明引用时只需要在对象的前面加上反斜杠 第一列是数组的引用: 代码示例: my @array = (1, 2, 3); my $array_ref = \@array; 第二种是哈希的引用 代码示例: my %hash = (1, 2, 3, 4); my $hash_ref = \@hash; 通过引用去访问对应的值,通过 -> 操作符 数组的引用, 通过 [ ] 中括号 加上对应的下标,代码示例: my @array = (1, 2, 3); my $ar

Perl在IC设计中的应用

Perl和Tcl是ic设计中最常用的两种脚本语言,在我学习perl之前完全的不知道他们到底是干什么的.在这里先总结一下Perl的作用: 1.用于生成Verilog代码 在写verilog时,经常遇到一些规律性强,编写又比较麻烦的代码,而这些恰恰又是可重用性比较强的.比如总线模块.FIR滤波器.IIR滤波器,只要 滤波器阶数和参数定了编码都大致相似的模块,就比较适合用来自动生成实现他们功能的verilog代码.Perl的强项在于文本处理,对于verilog 代码的生成,perl的代码会比较简洁易写

[Perl系列二-实战] 1. Perl 读取代码的行数

前言 有的时候有这些需求: 1. 统计一个文件的行数 2. 统计一个源代码的有效行数.排除空行和注释行 3. 统一一个目录下各种文件的数量和行数 要达成这些需求,很多语言多可以做到, 但是使用Perl 应该是一个不错的选择 读取文件行数 读取一个文件的总行数(空行和注释都包含) 使用Perl 很简单 open(FILE ,<>); my $lines_counter = 0; while(<>) { $lines_counter += 1; } print "lines:

小时代-Perl 5 to 6 中译版 ( 完整 )

在本帖连续 3 周所发 "Perl 5 to 6 中译版" 都以完成, 感谢 py 的支持 ( 很多地方看不懂的英文都是问他 ). 有什么译得不好, 和错误的地方,大家回帖,我来更正. 如果想只看所有译文, 请点击上方的 "只看该作者" 想试完, 装我打包的 rpm 包. rpm -ivh http://repo.php-oa.com/6/RPMS/x86_64/nqp-2014.04-1.0.el6.x86_64.rpm rpm -ivh http://repo.

PHP中的ob_start用法详解

用PHP的ob_start();控制您的浏览器cache Output Control 函数可以让你自由控制脚本中数据的输出.它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况.输出控制函数不对使用 header() 或 setcookie(), 发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用.我们先举一个简单的例子,让大家对Output Control有一个大致的印象:Example 1. 程序代码 程序代码<?phpob_start(

perl5 第十二章 Perl5中的引用/指针

第十二章 Perl5中的引用/指针 by flamephoenix 一.引用简介二.使用引用三.使用反斜线(\)操作符四.引用和数组五.多维数组六.子程序的引用  子程序模板七.数组与子程序八.文件句柄的引用 一.引用简介    引用就是指针,可以指向变量.数组.哈希表(也叫关联数组)甚至子程序.Pascal或C程序员应该对引用(即指针)的概念很熟悉,引用就是某值的地址,对其的使用则取决于程序员和语言的规定.在Perl中,可以把引用称为指针,二者是通用的,无差别的.引用在创建复杂数据方面十分有用

java成神之——java中string的用法

java中String的用法 String基本用法 String分割 String拼接 String截取 String换行符和format格式化 String反转字符串和去除空白字符 String获取指定位置字符和replace的使用 StringBuffer的使用 字符串转换 基本类型的转换 添加字符编码 Base64的编码和解码 结语 java中String的用法 String基本用法 字符串一旦创建在堆中就不可变 字符串声明 String str = "你好"; String s

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

晚上花几分钟在windows下测了下pthread的用法,出现错误 1 error LNK2019: 无法解析的外部符号 __imp__pthread_create,该符号在函数 _main 中被引用 经网上搜,反正都没解决,其中一个说引入#pragma comment(lib, "pthreadVC2.lib")后解决,但笔者遇到的不是这个原因,而是版本问题.可参考http://www.cnblogs.com/zhjh256/p/6364777.html解决.