Perl 引用:引用就是指针,Perl 引用是一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至子程序。
Perl 引用
引用就是指针,Perl 引用是一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方。
1、创建引用
1.使用斜线\
定义变量的时候,在变量名前面加个\,就得到了这个变量的一个引用。
比如:
# 数组的引用
my@array= (1,2,3) ;
my$aref=\@array ;
#哈希的引用
my%hash= ("name"=>"zdd","age"=>30,"gender"=>"male") ;
my$href=\%hash ;
#标量的引用
my$scalar=1 ;
my$sref=\$scalar ;
2.匿名引用(很常用)
2.1匿名数组引用-用[]定义。
$aref= [ 1,"foo",undef,13 ];
2.2匿名数组的元素仍然可以是匿名数组,所以我们可以用这种方法构造数组的数组,可以构造任意维度的数组。
my $aref = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
2.3匿名哈希引用-用{}定义。
$href= { APR =>4, AUG =>8 };
2、使用引用
1.与普通变量的访问方法相比,假设原来的变量名是name,则现在用$name来代替name。
my $scalar = ;
my @array = (, , ) ;
my %hash = (, ) ;
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[], "\n" ;
print $$href{'zdd'}, "\n" ;
2.与普通变量的访问方法相比,假设变量原来的名字是name,则现在用{$name}来代替name。
数组引用的使用方法如下
@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,不过初学最好养成使用{}的习惯。
my $scalar = ;
my @array = (, , ) ;
my %hash = (, ) ;
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}[], "\n" ;
print ${$href}{'zdd'}, "\n" ;
3.前两种方法比较繁琐,这种很简洁,就是使用箭头符号->。
$aref->[] 数组解引用
$href->{} 哈希解引用
$href->() 子过程解引用
$aref->[0] =3 ;
$href->{name} ="autumn" ;
$sref=2 ;
也可以将引用赋值给其他变量
my$aref1=$aref ;
my$href1=$href ;
my$scalar1=$scalar ;
my $scalar = ;
my @array = (, , ) ;
my %hash = (, ) ;
my $sref = \$scalar ; # scalar reference
my $aref = \@array ; # array reference
my $href = \%hash ; # hash reference
# 方法三,不适用于标量
print $aref->[], "\n" ;
print $href->{'zdd'}, "\n" ;
4.数组的数组
@a = (
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
)
我们知道[1, 2, 3]定义了一个(1, 2, 3)的匿名引用,所以数组a实际上包含三个元素,每个元素是一个引用,该引用指向一个数组,所以我们可以用下面的方法来访问数组元素(注意,下标从0开始)。
my $aref = [, [, ], [, , ]] ; print $aref->[] , print $aref->[][], print $aref->[][],
5.哈希的哈希
my $student_properties_of = {
'zdd' => {
,
,
',
},
'autumn' => {
,
,
',
}
} ;
3、引用的赋值
$aref2 = $aref1; 将使得$aref2和$aref1指向同一个数组,如果想将$aref1指向的数组拷贝一份给$aref2的话,使用 $aref2 = [@{$aref1}] 方法,[]里面对数组进行解引用,而[]以解引用后的数组为内容生成了一个新的匿名数组,又赋值给$aref2。
注意:不能使用 $aref2 = @{$aref1} 的形式,外层的[]是不可缺少的。由于=左边是标量,所以右边的数组会被解释为标量环境,得到的是数组元素个数,而不是元素本身。但是如果加上[]就可以了,这样perl知道这是一个匿名数组的赋值。
4、判断一个变量是否是引用
使用ref函数即可,如果变量是引用则返回真,否则返回假。实际上它更智能,它会返回引用对应的类型,比如HASH或者ARRAY。
my $aref1 = [, , ] ;
print ref $aref1, "\n" ; #输出 ARRAY
if (ref $aref1) {
print "true\n" ; #输出 true
}
5、判断两个引用是否指向同一个目标
可以用eq,这将以字符串的形式判断,也可以使用== 。
my $aref1 = [, , ] ;
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 引用:引用就是指针,Perl 引用是一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至子程序。的更多相关文章
- c++值传递,指针传递,引用传递以及指针与引用的区别
值传递: 形参是实参的拷贝,改变形参的值并不会影响外部实参的值.从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出.当函数内部需要修改参数,并且不希望这个改变影 ...
- C++学习笔记 指针与引用
指针与引用 1. 指针 (1) 指针是一个变量(实体),存储的是一个地址,指向内存的一个存储单元,指针可以为空 (2) 指针可以为空,在声明定义时可以不初始化 (3) 指针在初始化之后可以重新指向其 ...
- C++ 中指针与引用的区别
指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过v ...
- 指针和引用的区别(c/c++)
http://blog.csdn.net/thisispan/article/details/7456169 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用 ...
- C++指针和引用
★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用是某块内存的别名. ★ 区别: 1. 指针是一个实体,而引用仅是个别名: 2. 引用使用时无需解引用(*),指 ...
- 【C++自我精讲】基础系列一 指针与引用
[C++自我精讲]基础系列一 指针与引用 一 前言 指针.引用.指针与引用区别. 二 指针 变量:代码中常常通过定义变量来申请并命名存储空间,并通过变量的名字来使用这段存储空间. //变量 ...
- 转 浅谈C++中指针和引用的区别
浅谈C++中指针和引用的区别 浅谈C++中指针和引用的区别 指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性 ...
- C++中引用传递与指针传递区别
C++中引用传递与指针传递区别 在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是值传递的方式,它所传递的是一个地址值.值传递过程 ...
- 解决老大难疑惑:指针 vs 引用
▶疑问描述 1. 引用reference的本质: 常指针 ——> 什么时候用指针?= 就按Java中的引用变量那样用? ——> 什么时候用引用? ①函数的入参/返回值时 ②T&am ...
随机推荐
- Sprint第一个冲刺(第二天)
一.Sprint介绍 今天我们完成了欢迎界面及美化的任务,即完成了此次整个Sprint的百分之七,登录界面及美化.注册界面(管理员).注册界面(餐厅员工)和注册界面(消费者),这几个任务也在进行时.这 ...
- dgraph 图数据库docker-compose安装试用
备注: 使用docker-compose进行安装 1. docker-compose.yml version: "3" services: zero: image: d ...
- yum安装postgresql
https://wiki.postgresql.org/wiki/YUM_Installation
- Jetty小计,比之tomcat调试还是不方便
不需要额外的工程支持,不需要硬盘中有tomcat之类的额外文件 Jetty的Debug:右键Debug as... Maven Builder Jetty相关的配置文件如下: <profiles ...
- java 类加载器体系结构
- SAX解析类:SaxHelper
public class SaxHelper extends DefaultHandler { private Person person; private ArrayList<Person&g ...
- python 面向对象(类的特殊成员)
python 面向对象: (思维导图 ↑↑↑↑) 类的特殊成员 python的类成员存在着一些具有特殊含义的成员 1.__init__: 类名() 自动执行 __init__ class Foo(ob ...
- Maven和Gradle的比较
Gradle和Maven都是项目构建工具,但是完全是两个产品,maven应该目前在java企业级开发中占的比重比较大,Gradle是后起之秀,Google的Android Stadio主推的就是Gra ...
- postman 请求 页面出现 Could not get any response 解决方法
1.关闭掉证书 2.再关闭掉代理 3.去掉请求头的Content-Length字段 (或者一个个试请求头的值,看去掉那些就请求成功了) 后记: 网友 @ 重庆张晓祥 提供了个线索确实让我想起以前我从浏 ...
- 配置IVR实现语音
1.新建系统录音档 登入FreePBX,在Admin面板下选择System Recordings,如下图: 在这个页面可以上传制作好的一些录音,例如像“欢迎致电XXX,按1中文,按2英文... ...