加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl 引用:引用就是指针,Perl 引用是一个标量类型可以指向变量

发布时间:2020-12-15 23:38:32 所属栏目:大数据 来源:网络整理
导读:Perl 引用 引用就是指针,Perl 引用是一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至子程序,可以应用在程序的任何地方。 1、创建引用 1.使用斜线 定义变量的时候,在变量名前面加个,就得到了这个变量的一个引用。 比如: # 数组的引用 [em

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读