写这篇是因为工作遇到一个需要使用列表作为hash的值的问题,这在Python中是非常简单而轻松的事,如下面这段python程序。

 def add_to_index(index, keyword, url):
if keyword in index:
index[keyword].append(url)
else:
index[keyword] = [url]

但在Perl中怎么办呢?答案是使用引用,同样轻松搞定。

创建引用

1.使用\操作符

#标量引用
my$scalar=;
my$sref=\$scalar ; # 数组引用
my@array= (,,) ;
my$aref=\@array ; #哈希引用
my%hash= ("name"=>"foo","age"=>,"gender"=>"male") ;
my$href=\%hash ; #子程序引用
sub handler {return }
$coderef = \&handler; #句柄引用
$globref = \*STDOUT;

其中,句柄引用有什么用?

2.匿名引用

定义一个普通数组: my @a = (1,2,3);

定义一个匿名数组引用: my $a = [1,2,3];

定义一个以匿名数组引用为元素的数组(实际是二维数组):

@a = (
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
)

其中:$a[1][2]表示第二行第三列元素6.

定义一个以匿名数组引用为元素的数组引用(实际是二维数组的引用):

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]的形式。

定义一个普通hash: my %h = (a=>1,b=>2,c=>3); #注意是小括号,不是大括号, 否则会报 Reference found where even-sized list expected at ...

定义一个匿名hash引用: my $h = {a=>1, b=>2, c=>3} #注意是大括号

注意: 匿名数组/hash的元素仍然可以是匿名数组/hash,所以我们可以用这种方法构造多维数组/hash:

 my $a = [
[, , ],
[, , ],
[, , ],
]
 my $h= {
'a' => {
'x' => ,
'y' => ,
'z' => ,
}, 'b' => {
'u' => '4',
'v' => '5',
'w' => '6',
}
} ;

使用引用

使用引用并不难,只要把引用的值当做原型的名字使用即可.

比如aref是一个数组引用,对应a是数组, 我们可以把$aref整体当做数组的名字a,因此要获取数组的值即: ${$a}[0], ${$a}[1]

遵循这个原则就很容易了.

 my $s =  ;
my @a = (, , ) ;
my %h = ('a' => , 'b' => ) ; my $sref = \$s;
my $aref = \@a;
my $href = \%h; print $$sref, "\n" ;
print @$aref, "\n" ;
print %$href, "\n" ;
print $$aref[], "\n" ;
print $$href{'a'}, "\n" ;

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

Reference

http://www.cnblogs.com/softwaretesting/archive/2011/07/26/2117730.html

Perl 引用与匿名数组的更多相关文章

  1. Perl匿名数组、hash和autovivification特性

    可有构建匿名的对象,这样就没必要去为只用一两次的数组.hash去取名字,有时候取名是很烦的事. 使用中括号[]构建匿名数组 使用大括号{}构建匿名hash 不包含任何元素的[]和{}分别是匿名空数组. ...

  2. Perl子程序引用和匿名子程序

    子程序也有引用,也有匿名子程序.假设你已经具备了数组.hash的引用知识,所以这里简单介绍一下. $ref_sub = \&mysub; # 子程序引用,&符号必须不能少 &{ ...

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

    Perl 引用引用就是指针,Perl 引用是一个标量类型可以指向变量.数组.哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方. 1.创建引用1.使用斜线\定义变量的时候,在变量名前面加个\, ...

  4. perl 引用(数组和hash引用) --- perlreftut - Mark 的一个简单的'引用'教程 ---Understand References Today. --Mark Jason Dominus, Plover Systems (mjd-perl-ref+@plover.com)

    https://blog.csdn.net/fangwei1235/article/details/8570886 首页 博客 学院 下载 论坛 APP 问答 商城 活动 VIP会员 招聘 ITeye ...

  5. perl 引用(一)

    1. 普通变量引用 variable reference 引用就好比C语言的指针,引用变量存储被引用变量的地址.赋值时注意要在变量前加上 \;使用时要多加一个 $ . 当然,引用也可以成为简单变量,可 ...

  6. <1>数据引用与匿名存储

    引用本身就是一种标量变量 引用变量,如 $ra 或$rarray ,就是一种普通的标量变量,因为我们使用"$" 符号. 变量变量可以是一个整数,一个字符串或者一个引用,而且还可以被 ...

  7. Perl引用

    引用就是C语言中的指针,perl引用是一个标量类型可以指向变量.数组.哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方. 在变量前面加一个\就得到了这个变量的一个引用 #!usr/bin/p ...

  8. Java SE学习之数组——匿名数组和不规则数组

    本文是学习网络上的文章时的总结以及自己的一点实践.感谢大家无私的分享. 近期偶然遇到了数组的问题,学习了匿名数组和不规则数组. 匿名数组适用于仅仅使用一次的情况:不规则数组适用是每行数据总数不确定的情 ...

  9. c/c++ 数组 数组的引用,指针数组的引用

    c/c++ 数组 知识点 1,数组的声明和初始化,对应代码里的test1和test2 2,char数组,对应代码里的test3 3,数组不可以拷贝和复制,对应代码里的test4 4,指针数组, 数组的 ...

随机推荐

  1. 判断是否为BST

    递归的方法,用返回false的方法.中序遍历的想法很好,空间浪费.遍历的过程记录上一次的值进行比较. //题目描述 // //请实现一个函数,检查一棵二叉树是否为二叉查找树. //给定树的根结点指针T ...

  2. 怎么去掉Xcode工程中的某种类型的警告

    XCode警告   问题描述  在我们的项目中,通常使用了大量的第三方代码,这些代码可能很复杂,我们不敢改动他们,可是作者已经停止更新了,当sdk升级或者是编译器升级后,这些遗留的代码可能会出现许许多 ...

  3. html5_common.js

    (function(){ this.sendAjax = function(url,func,formData,type){ type = type || "POST"; //默认 ...

  4. hadoop中HBase子项目入门讲解

    HBase 是Hadoop的一个子项目,HBase采用了Google BigTable的稀疏的,面向列的数据库实现方式的理论,建立在hadoop的hdfs上,一方面里用了hdfs的高可靠性和可伸缩行, ...

  5. Warning: $HADOOP_HOME is deprecated.解决方法

    方式1(不推荐):注释hadoop-config.sh中的 if [ "$HADOOP_HOME_WARN_SUPPRESS" = "" ] && ...

  6. Context3D 不可用

    打开项目文件夹中的html-template,并找到index.template.html,右键使用TextEditor编辑,在params.allowfullscreen=”true”:后面加上pa ...

  7. python oop __slots__方法

    动态语言python 可以在程序运行的情况下给class加上功能.具体为 #引入一个 from types import MethodType #方法 #然后 s.set_age = MethodTy ...

  8. socket对于大数据的发送和接收

    大数据是指大于32K或者64K的数据. 大数据的发送和接收通过TSTREAM对象来进行是非常方便的. 我们把大数据分割成一个个4K大小的小包,然后再依次传输. 一.大数据的发送的类语言描述: 1)创建 ...

  9. Android打开WIFI或者移动网络的代码实现

    MainActivity如下: package wy.testnetwork; import java.lang.reflect.Field; import java.lang.reflect.Inv ...

  10. CodeForces 702 A Maximum Increase (贪心,高效算法)

    题意:给定 n 个数,问你连续的最长的序列是几个. 析:从头扫一遍即可. 代码如下: #include <cstdio> #include <string> #include ...