Perl 引用与匿名数组
写这篇是因为工作遇到一个需要使用列表作为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 引用与匿名数组的更多相关文章
- Perl匿名数组、hash和autovivification特性
可有构建匿名的对象,这样就没必要去为只用一两次的数组.hash去取名字,有时候取名是很烦的事. 使用中括号[]构建匿名数组 使用大括号{}构建匿名hash 不包含任何元素的[]和{}分别是匿名空数组. ...
- Perl子程序引用和匿名子程序
子程序也有引用,也有匿名子程序.假设你已经具备了数组.hash的引用知识,所以这里简单介绍一下. $ref_sub = \&mysub; # 子程序引用,&符号必须不能少 &{ ...
- Perl 引用:引用就是指针,Perl 引用是一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至子程序。
Perl 引用引用就是指针,Perl 引用是一个标量类型可以指向变量.数组.哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方. 1.创建引用1.使用斜线\定义变量的时候,在变量名前面加个\, ...
- 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 ...
- perl 引用(一)
1. 普通变量引用 variable reference 引用就好比C语言的指针,引用变量存储被引用变量的地址.赋值时注意要在变量前加上 \;使用时要多加一个 $ . 当然,引用也可以成为简单变量,可 ...
- <1>数据引用与匿名存储
引用本身就是一种标量变量 引用变量,如 $ra 或$rarray ,就是一种普通的标量变量,因为我们使用"$" 符号. 变量变量可以是一个整数,一个字符串或者一个引用,而且还可以被 ...
- Perl引用
引用就是C语言中的指针,perl引用是一个标量类型可以指向变量.数组.哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方. 在变量前面加一个\就得到了这个变量的一个引用 #!usr/bin/p ...
- Java SE学习之数组——匿名数组和不规则数组
本文是学习网络上的文章时的总结以及自己的一点实践.感谢大家无私的分享. 近期偶然遇到了数组的问题,学习了匿名数组和不规则数组. 匿名数组适用于仅仅使用一次的情况:不规则数组适用是每行数据总数不确定的情 ...
- c/c++ 数组 数组的引用,指针数组的引用
c/c++ 数组 知识点 1,数组的声明和初始化,对应代码里的test1和test2 2,char数组,对应代码里的test3 3,数组不可以拷贝和复制,对应代码里的test4 4,指针数组, 数组的 ...
随机推荐
- Hadoop-- MapReduce简单理解
1.Hadoop和MapReduce概念 Mapreduce是一种模式. Hadoop是一种框架. Hadoop是一个实现了mapreduce模式的开源的分布式并行编程框架. 2.Hadoop框架 ...
- vim7.4 安装 k-vim
注:在虚拟机 kali 1.9中安装完成之后,无法连接到网络(目前没找到有效的解决方法,不知道是不是通病,本人安装了两次,都一样),cpu占用率 70%+ ,建议安装之前,先建立快照,否则,后悔莫极 ...
- mongodb使用中遇到的问题汇总
1. 每次重新打开mongo,都会显示:forked process:xxxx ,然后用 find -name mongod.lock 进行搜索,发现在 ./var/lib/mongodb/ 目录下又 ...
- Python 读取文件下所有内容、获取文件名、截取字符、写回文件
# coding=gbk import os import os.path #读取目录下的所有文件,包括嵌套的文件夹 def GetFileList(dir, fileList): newDir ...
- 监听mysql是否挂了
监听mysql是否挂了,如果挂了就重启mysql 方式一: #!/bin/bash pgrep -x mysqld &> /dev/null if [ $? -ne 0 ] then e ...
- 第三百五十六天 how can I 坚持
一年了,三百五十六天.写个算法算下对不对. 今天突然想买辆自行车了.云马智行车,还是捷安特,好想买一辆. 网好卡.貌似少记了一天呢,357了.好快. 睡觉了,还没锻炼呢,太晚了. 1458748800 ...
- windows下揪出java程序占用cpu很高的线程 并找到问题代码 死循环线程代码
我的一个java程序偶尔会出现cpu占用很高的情况 一直不知道什么原因 今天终于抽时间解决了 系统是win2003 jvisualvm 和 jconsole貌似都只能看到总共占用的cpu 看不到每个线 ...
- ACM 中常用的算法有哪些? 2014-08-21 21:15 40人阅读 评论(0) 收藏
ACM 中常用的算法有哪些?作者: 张俊Michael 网络上流传的答案有很多,估计提问者也曾经去网上搜过.所以根据自己微薄的经验提点看法. 我ACM初期是训练编码能力,以水题为主(就是没有任何算法, ...
- poj 1564 Sum It Up (DFS+ 去重+排序)
http://poj.org/problem?id=1564 该题运用DFS但是要注意去重,不能输出重复的答案 两种去重方式代码中有标出 第一种if(a[i]!=a[i-1])意思是如果这个数a[i] ...
- AutoCAD DxfCode组码值类型
0-9 字符串(随着从 AutoCAD 2000 起引入了扩展符号名称,字数限制已由 255 个字符扩大到 2049 个单字节字符,不包括行末的换行符) 10-39 双精度三维点值 40-59 双精度 ...