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 = 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
   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 = 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" ;
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, 2, 3) ;
my %hash = ('zdd' => 30, '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, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
)
我们知道[1, 2, 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, 2, 0] ;
print ref $aref1, "\n" ;         #输出 ARRAY
if (ref $aref1) {
    print "true\n" ;                 #输出 true
}



5、判断两个引用是否指向同一个目标
可以用eq,这将以字符串的形式判断,也可以使用== 。

my $aref1 = [1, 2, 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 (==)



扫描二维码关注公众号,回复: 2996510 查看本文章

猜你喜欢

转载自www.cnblogs.com/sunziying/p/9569766.html
今日推荐