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. 遍历哈希

  • 使用 foreachfor 循环遍历键:
  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

如果你有具体问题或需要更复杂的哈希操作示例,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注