雜湊

雜湊可以理解為查詢表。你可以通過為每個內容指定金鑰來訪問其內容。鍵必須是字串。如果他們不是,他們將被轉換為字串。

如果你給雜湊只是一個已知的金鑰,它將為你提供它的價值。

# Elements are in (key, value, key, value) sequence
my %inhabitants_of = ("London", 8674000, "Paris", 2244000);

# You can save some typing and gain in clarity by using the "fat comma"
# syntactical sugar. It behaves like a comma and quotes what's on the left.
my %translations_of_hello = (spanish => 'Hola', german => 'Hallo', swedish => 'Hej'); 

在下面的示例中,請注意括號和符號:使用 $hash{key} 訪問%hash 的元素,因為你想要的是標量。一些人認為引用金鑰是好習慣,而其他人認為這種風格在視覺上很嘈雜。只有那些可能被誤認為像 $hash{'some-key'} 這樣的表達的鍵才需要引用

my $greeting = $translations_of_hello{'spanish'};

雖然預設情況下 Perl 會嘗試將裸字用作字串,但+修飾符也可用於向 Perl 指示不應插入金鑰,而是將執行結果用作金鑰執行:

my %employee = ( name => 'John Doe', shift => 'night' );
# this example will print 'night'
print $employee{shift}; 

# but this one will execute [shift][1], extracting first element from @_,
# and use result as a key
print $employee{+shift};

與陣列一樣,你可以同時訪問多個雜湊元素。這稱為雜湊切片。結果值是一個列表,因此使用 @ sigil:

my @words = @translations_of_hello{'spanish', 'german'}; # ('Hola', 'Hallo')

使用 keys keys 迭代雜湊的鍵將以隨機順序返回專案。如果你願意,可以與 sort 結合使用。

for my $lang (sort keys %translations_of_hello) {
  say $translations_of_hello{$lang};
}

如果你實際上不需要像前面示例中那樣的鍵,values 會直接返回雜湊值:

for my $translation (values %translations_of_hello) {
  say $translation;
}

你還可以使用帶有 each 的 while 迴圈來迭代雜湊。這樣,你將同時獲得鍵和值,而無需單獨的值查詢。然而,它的使用是沮喪的,因為 each 可能會以錯誤的方式打破。

# DISCOURAGED
while (my ($lang, $translation) = each %translations_of_hello) {
  say $translation;
}

訪問 unset 元素會返回 undef,而不是錯誤:

my $italian = $translations_of_hello{'italian'}; # undef

map 和 list flattening 可用於從陣列中建立雜湊。這是建立一組值的常用方法,例如快速檢查值是否在 @elems 中。此操作通常需要 O(n) 時間(即與元素數量成比例),但可以通過將列表轉換為雜湊值在恆定時間(O(1))內完成:

@elems = qw(x y x z t);
my %set = map { $_ => 1 } @elems;   # (x, 1, y, 1, t, 1)
my $y_membership = $set{'y'};       # 1
my $w_membership = $set{'w'};       # undef

這需要一些解釋。@elems 的內容被讀入列表,由 map 處理。map 接受為其輸入列表的每個值呼叫的程式碼塊; 元素的值可以在 $_ 中使用。我們的程式碼塊為每個輸入元素返回兩個列表元素:$_,輸入元素和 1,只是一些值。一旦你考慮了列表展平,結果是 map { $_ => 1 } @elemsqw(x y x z t) 變成了 (x => 1, y => 1, x => 1, z => 1, t => 1)

當這些元素被分配到雜湊中時,奇數元素變為雜湊鍵,偶數元素變為雜湊值。當在列表中多次指定金鑰以分配給雜湊時,最後一個值獲勝。這有效地丟棄了重複。

將列表轉換為雜湊的更快方法是使用對雜湊切片的賦值。它使用 x 運算子將單元素列表 (1) 乘以 @elems 的大小,因此左側切片中的每個鍵都有一個 1 值:

@elems = qw(x y x z t);
my %set;
@set{@elems} = (1) x @elems;

以下雜湊應用程式還利用雜湊和列表通常可以互換使用來實現命名函式 args 的事實:

sub hash_args {
  my %args = @_;
  my %defaults = (foo => 1, bar => 0);
  my %overrides = (__unsafe => 0);
  my %settings = (%defaults, %args, %overrides);
}

# This function can then be called like this:
hash_args(foo => 5, bar => 3); # (foo => 5, bar => 3, __unsafe ==> 0)
hash_args();                   # (foo => 1, bar => 0, __unsafe ==> 0)
hash_args(__unsafe => 1)       # (foo => 1, bar => 0, __unsafe ==> 0)

當用作布林值時,如果它們不是空的,則為真。