1、哈希的基本用法
用数组初始化%hash为a=>1,b=>2 %hash=('a',1,'b',2);
意义同上,只是另一种更形象化的写法。%hash=('a'=>1,'b'=>2);
如果key是字符串,可以省略引号。下面这行和上面那行是一样的%h=(a=>1,b=>2);
哈希的赋值
将列表赋值到哈希是常常发现列表中的键值对不容易区分。
Perl使用胖箭头(=>)来代替逗号。
my %animal = (
'dog' => 'caoqing',
'cat' => 'xiaohhuan',
'pig' => 'xiaobao',
);
使用旁箭头是可以省略键的引号,左边的部分可以被自动引用。
无需引号的字符序列,称为裸字。
允许省略键名义好的地方是花括号中检索指定键名的元素。比如$animal{'dog'}可以简写为$animal{dog}。不加引号已经成为惯例,如果花括号内不是裸字,Perl会将其做为表达式求值,结果作为键名。
哈希函数
keys和values函数
keys函数返回哈希的键列表,values函数返回哈希的值列表。
my %hash = ('a' => 1, 'b' => 2, 'c' => 3,);
my [@k](https://my.oschina.net/doloop) = keys %hash;
my [@v](https://my.oschina.net/opleo) = values %hash;
print "@k\n";
print "@v";
a b c
1 2 3
Perl会根据需要重新优化排列顺序,以保持高速访问。在标量上下文中,这两个元素会返回哈希中的元素个数。这个过程不需要遍历整个哈希,所以非常高效。
my %hash = ('a' => 1, 'b' => 2, 'c' => 3,);
my [@k](https://my.oschina.net/doloop) = keys %hash;
my @v = values %hash;
my $count = @k;
print "$count\t";
my $count2 = @v;
print "$count2";
3 3
哈希也可以当作布尔值来判断真假,至少有一个键值对,就返回真。
用{}来访问print “$hash{a}\n”;
打印 $hash{b}='2b'; print “$hash{b}\n”; #打印2b
删除key用delete delete$hash{b};
从$hash删除'b'
清空hash :undef %h
each函数
需要迭代整个哈希时,常见就是each函数,包含两个元素的列表形式返回键值对每次对同一个哈希调用此函数,就会返回下一组键值对,直到所有的元素都被访问过。在没有任何键值对时,each函数会返回空列表。
唯一适合使用each的地方就是在while循环里。
my %hash = ('a' => 1, 'b' => 2, 'c' => 3,);
while (($key, $value) = each %hash) {
print "$key => $value\n";
}
c => 3
a => 1
b => 2
each返回键值对是乱序的,keys和values返回哈希的自然顺序,如果一次处理哈希,只需要对键排序。
my %hash = ('a' => 1, 'b' => 2, 'c' => 3,);
foreach $key (sort keys %hash) {
$value = $hash{$key};
print "$key => $value\n";
}
a => 1
b => 2
c => 3
哈希的典型应用
exists函数
若要检查哈希中是否存在某个键,可以使用exists函数,返回真假,分别表示键存在与否。
my %hash = ('a' => 1, 'b' => 2, 'c' => 3,);
if (exists $hash{d}) {
print "i love you";
} else {
print "i hate you";
}
i hate you
delete函数
delete函数可以从哈希删除指定的键及其对应的值。假如键不存在,会直接结束,不出现警告信息或错误信息。
my %hash = ('a' => 1, 'b' => 2, 'c' => 3,);
delete $hash{a};
print keys %hash;
1. 编程读取用户指定的名字并且汇报相应的姓。
my %last_name = qw {
cao qing
xiao bao
wang huan
};
print "Enter a first name: ";
chomp(my $name = <STDIN>);
print "That is $name $last_name{$name}.\n";
2.编程读取单词,然后打印列出每个单词出现次数的列表。
my (@words, %count, $word);
@words = qw(i love you cao qing. you are the best people on the world!);
foreach $word (@words) {
$count{$word} += 1;
}
foreach $word (keys %count) {
print "$word was seen $count{$word} times.\n";
}
2、哈希数组
哈希内嵌套数组
1.哈希内嵌数组语法格式如下:声明及定义
my%哈希变量=(
哈希键1=>[数组元素1,数组元素2,…,数组元素n],
哈希键2=>[数组元素1,数组元素2,…,数组元素n],
…...…...
哈希键n=>[数组元素1,数组元素2,…,数组元素n]
);
访问内嵌数组的单个元素: $哈希变量名{哈希键}->[数组下标]
访问内嵌数组: @{$哈希变量名{哈希键}}
例如,游戏地图上有一组建筑物的坐标,分别如下
:武器店:123,35修练场
:85,196防具店
:67,96魔法店
:128,45
用哈希内嵌数组的方式来存储和访问这些数据。
1)存储
my%game=(
“武器店”=>[123,35],
“修练场”=>[85,196],
“防具店”=>[67,96],
“魔法店”=>[128,45]
);
2)访问
访问防具店的坐标值: printf("%d,%d",@{$game{"防具店"}});
访问魔法店的坐标Y值:print$game{“防具店”}->[1];
可使用硬引用符来完成内嵌数组的赋值。
my%game;
my@array=(123,35);
$game{"武器店"}=\@array;
my@array=(85,196);
$game{"修练场"}=\@array;
my@array=(67,96);
$game{"防具店"}=\@array;
my@array=(67,96);
$game{"魔法店"}=\@array;
printf("%d,%d",@{$game{"防具店"}});