(本文参考博客)
对于数据存储而言个人键值对可以说是很多场景,更是费长方便的存储方式,要远远比传统的数字索引的方式通过数组处理数据的要方便很多很多的。下面介绍 Perl 中的哈希。
1. 哈希
哈希是 Perl 的一种数据类型,比较类似数组,用于存放数据,包括2部分关键字keys和值value(即键值对)。不同于传统数组,哈希访问元素的是按照key => value(key 对应去找 value)。
其中 key 可以是任意的字符串,你可以使用任何的字符串作为 key,但它们是唯一的。 一个 key 可以对应多个 value。
哈希是 key/value 对的集合。
Perl中哈希变量以百分号 (%) 标记开始。访问哈希元素格式:${key}。以下是一个简单的哈希实例:
#!/usr/bin/perl
%data = ('a', 'a.com', 'b', 'b.com', 'c', 'c.com');
print "\$data{'a'} = $data{'a'}\n";
print "\$data{'b'} = $data{'b'}\n";
print "\$data{'c'} = $data{'c'}\n";
输出结果:
1.1 哈希的创建
1.1.1 逐个创建
一个键对应一个值,一个一个对应创建:
$ha_xi{'a'} = 'a.com';
$ha_xi{'b'} = 'b.com';
$ha_xi{'c'} = 'c.com';
1.1.2 大范围的创建(利用列表)
与数组一样,可以使用列表进行创建:
%data = ('a', 'a.com', 'b', 'b.com', 'c', 'c.com');
也可以使用符号: => ;该符号处于键和值的之间(=> 是perl运算符)。例如:
%data = ('a'=>'a.com', 'b'=>'b.com', 'c'=>'c.com');
以下实例是上面实例的变种,使用 - 来代替引号:(使用这种方式 key 不能出现空格,读取元素方式为:)
%data = (-a=>'a.com', -b=>'b.com', -c=>'c.com');
读取的方式也很不同:
$val = $data{-a}
$val = $data{-b}
1.2 访问哈希元素
1.2.1 逐个访问
访问哈希元素格式:${key},注意:哈希为大括号,数组为方括号,键为字符串
$hash_name{"$key"}
1.2.2 多个数值读出存入数组
你可以像数组一样从哈希中提取值。
哈希值提取到数组语法格式:@{key1,key2}。例如:
#!/uer/bin/perl
%data = (-a=> 45, -b=> 30, -c=> 40);
@array = @data{-a, -c};
print "Array : @array\n";
输出结果:
1.2.3 读取哈希的 key 和 value
@key = keys%hash; #返回键列表
@value = values%hash; #返回值列表,与key顺序一致
$num = keys %hash; #返回键值对的个数
#Perl哈希获取key和value
#!/uer/bin/perl
%data = (-a=> 45, -b=> 30, -cc=> 40);
@key = keys%data;
@value = values%data;
$number = keys%data;
print "key = @key\n";
print "value = @value\n";
print "number = $number\n";
输出结果:(想得到具体哪个可以通过索引进行访问,类似 $key[0])
1.2.4 检测元素是否存在
%data = (-a=> 45, -b=> 30, -cc=> 40);
exists $data {"aa"}; #判断是否存在aa键;返回值是真假,一般放在if语句中
1.2.5 哈希中添加或删除元素
添加 key/value 对可以通过简单的赋值来完成。但是删除哈希元素你需要使用 delete 函数:
delete函数将某个给定的key(包括其对应的value)从hash中删除。如果不存在这个key,则什么也不做,不会有警告或者错误信息。
#!/usr/bin/perl
%data = ('a'=>'a.com', 'b'=>'b.com', 'c'=>'c.com');
@keys = keys %data;
$size = @keys;
print "ha_size_1: $size\n";
# 添加元素
$data{'d'} = 'd.com';
@keys = keys %data;
$size = @keys;
print "ha_size_2: $size\n";
# 删除哈希中的元素
delete $data{'b'};
@keys = keys %data;
$size = @keys;
print "ha_size_3: $size\n";
输出结果:
1.2.6 迭代哈希
哈希的迭代基本是使用 foreach 和 while 来迭代哈希:
- 使用foreach:
#!/usr/bin/perl
%ha_xi= ('a'=>'a.com', 'a'=>'a.com', 'a'=>'a.com');
foreach $key (keys %data){
print "$data{$key}\n";
}
- 使用while:
#!/usr/bin/perl
%ha_xi= ('a'=>'a.com', 'a'=>'a.com', 'a'=>'a.com');
while(($key, $value) = each(%data)){
print "$data{$key}\n";
}
输出结果:
a.com
b.com
c.com