%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,不过初学最好养成使用{}的习惯。
方法三
前两种方法比较繁琐,这种很简洁,就是使用箭头符号->
$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 $$sref, "n" ;
print @$aref, "n" ;
print %$href, "n" ;
print $$aref[2], "n" ;
print $$href{'zdd'}, "n" ;
# 方法二
print ${$sref}, "n" ;
print @{$aref}, "n" ;
print %{$href}, "n" ;
print ${$aref}[2], "n" ;
print ${$href}{'zdd'}, "n" ;
# 方法三,不适用于标量
print $aref->[0], "n" ;
print $href->{'zdd'}, "n" ;
数组的数组
@a = (
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
)
我们知道[1, 2, 3]定义了一个(1, 2, 3)的匿名引用,所以数组a实际上包含三个元素,每个元素是一个引用,该引用指向一个数组,所以我们可以用下面的方法来访问数组元素(注意,下标从0开始)
$a[1][2]表示第二行第三列元素6,也可以写成$a[1]->[2],不过很少有人这么写。还可以写成${$a[1]}[2],几乎没人这么写!
多维数组的另一个写法如下:
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
这两者的区别有以下几点:
1)、前者是真正的数组,所以定义变量是使用@,后者是指向匿名数组的引用,所以定义的时候使用$
2)、前者的数组元素是匿名数组,而外层数组则是实体数组,后者无论元素还是外层数组都是匿名数组
3)、前者可以用$a[x][y]的形式访问,而后者只能用解引用的方式访问,即$a->[x][y]的形式。
数组的哈希,哈希的数组,哈希的哈希
也就是哈希表中的每个元素也是一个哈希表,比如一个学生集合组成的哈希,其key是学生名字(唯一),其值是每个学生的属性,比如年龄,身高及学号等。









