跳转到内容

Perl 编程/散列变量

来自维基教科书,开放的书籍,为了开放的世界
前一章: 数组变量 索引 下一章: 引用和数据结构


Perl 散列类似于普通数组,但它不使用整数索引,而是使用可以取任何标量值的“键”。这些通常是字符串或数字。

语法: 关联数组不使用 `@` 运算符,而是使用 `%` 符号,并且不像 `$myarray[0]` 中那样使用方括号 `[]`,散列元素使用花括号 `{}` 引用,如 `$myhash{"george"}`。

散列是 Perl 中最强大和最常用的功能之一。一个典型的用法是构建一个包含“字典”的散列,其中每个键都是字典中的一个词,相应的 value 是这些词的定义。

下面是一个包含各种家庭宠物发出的声音的散列

my %petsounds = ("cat" => "meow",
                 "dog" => "woof",
                 "snake" => "hiss");

`=>` 和 `,` 实际上是可以互换的,所以右侧可以看起来和数组完全一样。这意味着你可以将数组分配给散列。在这样的赋值中,数组中每个偶数索引的元素(从 0 开始)都成为散列中的一个键。以下语句创建与前一个相同的散列

my @array = ("cat", "meow", "dog", "woof", "snake", "hiss");
my %petsounds = @array;

但是第一种风格更受欢迎,因为它使语句更易读。

要访问散列元素,请使用花括号

 print STDOUT "The cat goes " . $petsounds{"cat"} . ".\n";

将以下内容打印到 STDOUT

The cat goes meow.

要向散列添加新的声音项

$petsounds{"mouse"} = "squeak!";

要覆盖现有元素,只需重新分配它

$petsounds{"dog"} = "arf!";  # The dog now goes "arf!"

要从散列中删除一项,请使用删除. 将值设置为未定义不会删除该项; 使用存在在设置为未定义的键上,仍然会返回 true。

delete($petsounds{"cat"});  # will remove "cat" from our hash

"关联数组"

[编辑 | 编辑源代码]

最初,“散列”被称为“关联数组”,但这个术语有点过时(人们厌倦了使用七个音节)。尽管对于编程新手来说并不直观,“散列”现在是首选术语。这个名字源自计算机科学术语 哈希表

使用散列

[编辑 | 编辑源代码]

打印散列内容

[编辑 | 编辑源代码]

如果你了解 PHP,你可能已经想到了用 `print_r` 打印数组内容的便捷方法...

use Data::Dumper;

print Dumper(\%hash);

计算散列中条目的数量

[编辑 | 编辑源代码]

要获得散列的大小,只需在标量上下文中求解 `keys` 函数的结果的大小

my %hash = (
   'key1' => 1,
   'key2' => 2
);

print "Hash has " . keys(%hash) . " elements\n";
my $num_elements = scalar(keys(%hash));

散列的散列的散列

[编辑 | 编辑源代码]

你可以定义多维散列数组变量。一个示例可能如下所示

#!/usr/bin/perl

use Data::Dumper;

my %a=();

$a{1}{"a"}{"A"}="FIRST";
$a{1}{"c"}{"B"}="THIRD";
$a{1}{"b"}{"C"}="SECOND";

foreach my $k1 ( sort keys %a ) {
  foreach my $k2 ( sort keys %{$a{$k1}} ) {
    foreach my $k3 ( sort keys %{$a{$k1}{$k2}} ) {
      print "$k1\t$k2\t$k3\t$a{$k1}{$k2}{$k3}\n";
    }
  }
}

print Dumper(\%a);

这段代码将生成

 1       a       A       FIRST
 1       b       C       SECOND
 1       c       B       THIRD
 $VAR1 = {
           '1' => {
                    'c' => {
                             'B' => 'THIRD'
                           },
                    'a' => {
                             'A' => 'FIRST'
                           },
                    'b' => {
                             'C' => 'SECOND'
                           }
                  }
         };


前一章: 数组变量 索引 下一章: 引用和数据结构
华夏公益教科书