跳转到内容

Perl 编程/哈希变量

来自维基教科书,开放的书籍,面向开放的世界
上一页:数组变量 索引 下一页:引用和数据结构


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

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

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

下面是一个包含各种家用宠物发出的声音的哈希

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!"

要从哈希中删除项,使用delete. 将值设置为undef不会删除该项;使用exists在已设置为undef的键上,仍然会返回 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'
                           }
                  }
         };


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