Like Share Discussion Bookmark Smile

J.J. Huang   2021-03-10   Perl   瀏覽次數:

Perl - 第七章 | Perl 哈希

哈希是 key/value 對的集合。
Perl 中哈希變量以百分號 (%) 標記開始。
訪問哈希元素格式:${key}。
以下是一個簡單的哈希範例:

1
2
3
4
5
6
7
#!/usr/bin/perl

%data = ('J.J.', 45, 'Lisa', 30, 'Kumar', 40);

print "\$data{'J.J.'} = $data{'J.J.'}\n";
print "\$data{'Lisa'} = $data{'Lisa'}\n";
print "\$data{'Kumar'} = $data{'Kumar'}\n";

這將產生以下結果:

1
2
3
$data{'J.J.'} = 45
$data{'Lisa'} = 30
$data{'Kumar'} = 40

建立哈希

哈希是通過以下兩種方式之一建立的。在第一種方法中,你要一個一個地為命名鍵分配一個值:

1
2
3
$data{'J.J.'} = 45;
$data{'Lisa'} = 30;
$data{'Kumar'} = 40;

在第二種情況下,你使用一個列表,該列表是通過從列表中的各個對中進行轉換的:該對中的第一個元素用作鍵,第二個元素用作值。例如:

1
%data = ('J.J.', 45, 'Lisa', 30, 'Kumar', 40);

為了清楚起見,你可以使用=>作為的別名,以指示鍵/值對,如下所示:

1
%data = ('J.J.' => 45, 'Lisa' => 30, 'Kumar' => 40);

這是上述形式的另一種形式,請看一下,這裡所有鍵前面都帶有連字符(-),並且在它們周圍都不需要引號:

1
%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);

但是需要特別注意的是,只有一個單詞,即沒有空格鍵以這種形式的散列形式使用,如果你以此方式建立散列,則只能使用連字符來訪問鍵,如下所示。

1
2
$val = %data{-JohnPaul}
$val = %data{-Lisa}

訪問哈希元素

從哈希訪問單個元素時,必須在變量前加一個美元符號($),然後在變量名稱後的大括號內附加元素鍵。例如:

1
2
3
4
5
6
7
#!/usr/bin/perl

%data = ('J.J.' => 45, 'Lisa' => 30, 'Kumar' => 40);

print "$data{'J.J.'}\n";
print "$data{'Lisa'}\n";
print "$data{'Kumar'}\n";

這將產生以下結果:

1
2
3
45
30
40

提取切片

你可以提取哈希的切片,就像可以從數組中提取切片一樣。你將需要對變量使用@前綴來存儲返回的值,因為它們將是值列表:

1
2
3
4
5
6
7
#!/uer/bin/perl

%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);

@array = @data{-JohnPaul, -Lisa};

print "Array : @array\n";

這將產生以下結果:

1
Array : 45 30

提取 Key 和 Value

你可以使用keys函數從哈希表中獲取所有鍵的列表,該函數具有以下語法:

1
keys %HASH

此函數返回命名哈希的所有鍵的數組。以下是範例:

1
2
3
4
5
6
7
8
9
#!/usr/bin/perl 

%data = ('J.J.' => 45, 'Lisa' => 30, 'Kumar' => 40);

@names = keys %data;

print "$names[0]\n";
print "$names[1]\n";
print "$names[2]\n";

這將產生以下結果:

1
2
3
Lisa
J.J.
Kumar

同樣,你可以使用values函數來獲取所有值的列表。此函數具有以下語法:

1
values %HASH

此函數返回一個普通數組,其中包含命名哈希的所有值。以下是範例:

1
2
3
4
5
6
7
8
9
#!/usr/bin/perl 

%data = ('J.J.' => 45, 'Lisa' => 30, 'Kumar' => 40);

@ages = values %data;

print "$ages[0]\n";
print "$ages[1]\n";
print "$ages[2]\n";

這將產生以下結果:

1
2
3
30
45
40

檢測元素是否存在

如果你在哈希中讀取不存在的 key/value 對 ,會返回 undefined 值,且在執行時會有警告提醒。

為了避免這種情況,我們可以使用 exists 函數來判斷key是否存在,存在的時候讀取:

1
2
3
4
5
6
7
8
9
#!/usr/bin/perl

%data = ('J.J.' => 45, 'Lisa' => 30, 'Kumar' => 40);

if( exists($data{'Lisa'} ) ) {
print "Lisa is $data{'Lisa'} years old\n";
} else {
print "I don't know age of Lisa\n";
}

在這裡,我們使用了IF … ELSE語句。現在你只是假設,如果(條件)只有當給定的條件為真,否則部分將被執行其他部分將會被執行。因此,當我們執行上述程序時,它會產生以下結果,因為此處存在給定條件($ data {‘Lisa’}返回true:

1
Lisa is 30 years old

獲取哈希大小

你可以通過使用鍵或值上的標量上下文來獲取大小-即哈希中元素的數量。簡單地說,首先你必須獲取鍵或值組成的數組,然後可以按如下所示獲取數組的大小:

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl

%data = ('J.J.' => 45, 'Lisa' => 30, 'Kumar' => 40);

@keys = keys %data;
$size = @keys;
print "1 - Hash size: is $size\n";

@values = values %data;
$size = @values;
print "2 - Hash size: is $size\n";

這將產生以下結果:

1
2
1 - Hash size: is 3
2 - Hash size: is 3

在哈希中添加和刪除元素

使用簡單的賦值運算符,只需一行程式碼即可添加新的鍵/值對。但是要從哈希中刪除元素,你需要使用delete函數,如下面的範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

%data = ('J.J.' => 45, 'Lisa' => 30, 'Kumar' => 40);
@keys = keys %data;
$size = @keys;
print "1 - Hash size: is $size\n";

# adding an element to the hash;
$data{'Ali'} = 55;
@keys = keys %data;
$size = @keys;
print "2 - Hash size: is $size\n";

# delete the same element from the hash;
delete $data{'Ali'};
@keys = keys %data;
$size = @keys;
print "3 - Hash size: is $size\n";

這將產生以下結果:

1
2
3
1 - Hash size: is 3
2 - Hash size: is 4
3 - Hash size: is 3

註:以上參考了
Tutorialspoint, Perl - Hashes