perl语言——哈希

1. 什么是哈希 hash

哈希是一种数据结构,可以存储任意长度的值并随意取用。

在数组中以数字为索引,但是哈希中以名字为索引,索引在哈希中称为键(key),它是任意唯一的字符串 ,即使是数字也会被转换成字符串。以键值对的形式存放数据。

注意

  1. 哈希中的键都是唯一的。
  2. 值可以不是唯一的。
  3. 键以字符串形式保存。
  4. 键值对的形式存放数据。
  5. 值可以是任何标量,比如数字,字符串,undef,及它们的组合。如果用数组给哈希中的索引赋值,那么赋的是数组最后一个的值。

2. 哈希的应用

主要应用场景:

  1. 按名字查找信息
  2. 按主机名找IP
  3. 按IP找主机
  4. 统计单词出现次数
  5. 按用户名统计每个人使用的磁盘数量。
  6. …………

3. 创建哈希对象并使用

整个哈希对象用**百分号%**做前缀。

哈希元素通过赋值来产生。

1
2
3
$h{'dong'}=999; # 赋值产生哈希键值对,如果第一次创建,那么创建哈希对象h
print $h{'dong'}; # 使用哈希对象
print"\n";

对哈希中键值对进行索引的时候用的是 **$前缀,并且是花括号{}**。

哈希和列表可以相互转化,可以通过列表对哈希赋值。格式如下程序,其中列表元素个数必须为偶数

1
2
3
4
5
6
7
%h = ('dong',10,'wang',20,'liu',30); 键 值一次排列
print $h{'dong'},"\n"; # 输出10
print $h{'wang'},"\n"; # 输出20
@arr = %h;
foreach (@arr) {
print $_,"\t"; # 输出 dong 10 liu 30 wang 20
}# 这里打印的顺序的随机的,不知道为什么?

两个哈希可以直接赋值。

1
my %H1 = %H2;

胖箭头创建哈希

1
2
3
4
5
%h = (
'dong' => 10,
'wang' => 20,
'liu' => 30
);

与之前的方法效果一样,主要是为了好看,并且可以省略键的引号。值的引号不能省略。

1
2
3
4
5
%h = (
dong => 'LIU',
wang => 'HU',
liu => 'SHAN'
);

4. 哈希函数

  1. reverse

    将哈希的键与值互换,要求哈希的值也是唯一的

    1
    %H1 = reverse %H2;
  2. keys和values函数

keys返回键列表,values返回值列表。

1
2
3
%h = ('dong',10,'wang',20,'liu',30); 键 值一次排列
@KEYS = keys %h;
@VALUES = values %h;
  1. each遍历哈希中的键值对

each每次返回一个键值对

1
2
3
4
%h = ('dong',10,'wang',20,'liu',30); 键 值一次排列
while(($key,$value)=each %h) {
print "$key : $value\n";
}

每次调用each,返回下一对键值对列表,如果全都执行到最后,那么返回空列表。在while的条件表达式中是标量环境,列表在标量环境中表示列表中元素个数,此时元素个数为0,那么不满足while循环条件,循环结束。

  1. exists查看是否有某个键
1
2
3
4
%h = ('dong',10,'wang',20,'liu',30); 键 值一次排列
if(exists $h{'dong'}) {
print "having dong \n";
}
  1. delete删除指定的键及对应值。
1
2
3
4
%h = ('dong',10,'wang',20,'liu',30); 键 值一次排列
if(delete $h{'dong'}) {
print "delete dong \n";
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!