Perl 引用
引用就是指针,Perl 引用是一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方。
1、创建引用
1.使用斜线
定义变量的时候,在变量名前面加个,就得到了这个变量的一个引用。
比如:
# 数组的引用
[email?protected]= (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,3],
??????? [4,5,6],
??????? [7,8,9],
]
2.3匿名哈希引用-用{}定义。
$href= { APR =>4,AUG =>8 };
2、使用引用
1.与普通变量的访问方法相比,假设原来的变量名是name,则现在用$name来代替name。
my $scalar = 1 ;
my @array = (1,2,3) ;
my %hash = (‘zdd‘ => 30,‘autumn‘ => 27) ;
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[2],"n" ;
print $$href{‘zdd‘},"n" ;
2.与普通变量的访问方法相比,假设变量原来的名字是name,则现在用{$name}来代替name。
数组引用的使用方法如下
?? @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,不过初学最好养成使用{}的习惯。
my $scalar = 1 ;
my @array = (1,‘autumn‘ => 27) ;
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}{‘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 = 1 ;
my @array = (1,‘autumn‘ => 27) ;
my $sref = $scalar ; # scalar reference
my $aref = @array ; # array reference
my $href = %hash ; # hash reference
# 方法三,不适用于标量
print $aref->[0],"n" ;
print $href->{‘zdd‘},"n" ;
4.数组的数组
@a = (
??? [1,
??? [4,
??? [7,9]
)
我们知道[1,3]定义了一个(1, 2, 3)的匿名引用,所以数组a实际上包含三个元素,每个元素是一个引用,该引用指向一个数组,所以我们可以用下面的方法来访问数组元素(注意,下标从0开始)。
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
5.哈希的哈希
my $student_properties_of = {
‘zdd‘ => {
‘age‘ => 30,‘hight‘ => 170,‘id‘ => ‘001‘,},‘autumn‘ => {
‘age‘ => 27,‘hight‘ => 165,‘id‘ => ‘002‘,}
} ;
?
3、引用的赋值
$aref2 = $aref1; 将使得$aref2和$aref1指向同一个数组,如果想将$aref1指向的数组拷贝一份给$aref2的话,使用 $aref2 = [@{$aref1}] 方法,[]里面对数组进行解引用,而[]以解引用后的数组为内容生成了一个新的匿名数组,又赋值给$aref2。
注意:不能使用 $aref2 = @{$aref1} 的形式,外层的[]是不可缺少的。由于=左边是标量,所以右边的数组会被解释为标量环境,得到的是数组元素个数,而不是元素本身。但是如果加上[]就可以了,这样perl知道这是一个匿名数组的赋值。
4、判断一个变量是否是引用
使用ref函数即可,如果变量是引用则返回真,否则返回假。实际上它更智能,它会返回引用对应的类型,比如HASH或者ARRAY。
my $aref1 = [1,0] ;
print ref $aref1,"n" ; #输出 ARRAY
if (ref $aref1) {
print "truen" ; #输出 true
}
?
5、判断两个引用是否指向同一个目标
可以用eq,这将以字符串的形式判断,也可以使用== 。
my $aref1 = [1,0] ;
my $aref2 = $aref1 ;
print $aref1,"n" ;
print $aref2,"n" ;
if ($aref1 eq $aref2) {
print "reference equaln" ;
}
if($aref1 == $aref2) {
print "reference equaln" ;
}
产生如下输出:
ARRAY(0x248bec)
ARRAY(0x248bec)
reference equal (eq)
reference equal (==)