Perl 哈希
在 Perl 中,哈希(Hash) 是一种用于存储键值对的数据结构,键是唯一的字符串,值可以是任意标量(数字、字符串、引用等)。哈希以 %
前缀标识,访问值时使用 $
前缀和键。以下是关于 Perl 哈希的详细说明:
1. 哈希的定义与声明
- 使用
my
声明哈希,限定其作用域。 - 哈希可以用键值对列表或
=>
(胖箭头)初始化。
my %person = ("name", "Alice", "age", 25, "city", "New York");
# 或者使用胖箭头(更清晰)
my %person = (
name => "Alice",
age => 25,
city => "New York"
);
2. 访问哈希元素
- 使用
$
前缀和键(用{}
括起来)访问值。
print $person{name}; # 输出 Alice
print $person{age}; # 输出 25
- 键不存在时返回
undef
。
print defined $person{country} ? "Defined" : "Undefined"; # 输出 Undefined
3. 哈希操作
- 添加或修改键值对:
$person{country} = "USA"; # 添加新键值对
$person{age} = 26; # 修改现有键的值
- 删除键值对:
- 使用
delete
删除指定键。perl delete $person{city}; # 删除 city 键
- 检查键是否存在:
- 使用
exists
函数。perl print exists $person{name} ? "Name exists" : "Name missing"; # 输出 Name exists
4. 获取哈希的键和值
- keys:返回所有键的列表。
my @keys = keys %person; # 返回 ("name", "age", "country")
- values:返回所有值的列表。
my @values = values %person; # 返回 ("Alice", 26, "USA")
- each:迭代键值对(较少使用)。
while (my ($key, $value) = each %person) {
print "$key: $value\n";
}
5. 遍历哈希
- 使用
foreach
或for
循环遍历键:
foreach my $key (keys %person) {
print "$key => $person{$key}\n";
}
- 输出示例:
name => Alice
age => 26
country => USA
6. 哈希切片
- 访问多个键对应的值:
my @info = @person{"name", "age"}; # 返回 ("Alice", 26)
7. 哈希引用
- 哈希可以存储为引用,保存在标量中:
my $hash_ref = { name => "Bob", age => 30 }; # 匿名哈希引用
print $hash_ref->{name}; # 输出 Bob
- 解引用:
my %new_hash = %$hash_ref; # 还原为哈希
8. 上下文
- 标量上下文:返回哈希的使用情况(格式为
used/total
桶)。
my $size = %person; # 可能输出类似 "3/8"(3 个键,分配 8 个桶)
- 列表上下文:返回键值对的扁平列表。
my @list = %person; # 返回 ("name", "Alice", "age", 26, "country", "USA")
9. 哈希操作函数
- sort:对键或值排序。
my @sorted_keys = sort keys %person; # 按字母顺序排序键
print "@sorted_keys"; # 输出 age country name
- 清空哈希:
%person = (); # 清空哈希
10. 注意事项
- 严格模式:使用
use strict;
强制声明变量,键必须是字符串。
use strict;
my %hash = (key => "value"); # 必须声明
- 键唯一性:重复的键会覆盖旧值。
my %test = (key => 1, key => 2); # key 的值被覆盖为 2
- 性能:哈希适合快速查找,但键值对无序。
11. 示例:统计单词出现次数
my @words = ("apple", "banana", "apple", "cherry");
my %count;
foreach my $word (@words) {
$count{$word}++; # 计数
}
foreach my $key (keys %count) {
print "$key: $count{$key}\n";
}
输出:
apple: 2
banana: 1
cherry: 1
如果你有具体问题或需要更复杂的哈希操作示例,请告诉我!