跳轉到內容

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'
                           }
                  }
         };


前一章: 陣列變數 索引 下一章: 引用和資料結構
華夏公益教科書