微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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 "true\n" ;                 #输出 true
}

 



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 (==)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐