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。
5、判断两个引用是否指向同一个目标
可以用eq,这将以字符串的形式判断,也可以使用== 。
my $aref1 = [1,0] ; 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 (==)