哈希

2018-02-24 16:03 更新

哈希是鍵/值對(duì)

如果你想按名字查詢,那么需要哈希。哈希的鍵必須唯一,但值可以是任意標(biāo)量。

有時(shí)候你仍然會(huì)看到人們稱它為“關(guān)聯(lián)數(shù)組”,但不要想當(dāng)然的把它作為數(shù)組。

通過(guò)鍵/值對(duì)列表來(lái)創(chuàng)建哈希

使用鍵/值對(duì)列表創(chuàng)建哈希:

my %stooges = (
    'Moe', 'Howard',
    'Larry', 'Fine',
    'Curly', 'Howard',
    'Iggy', 'Pop',
);

=>?稱為胖逗號(hào),它與逗號(hào)相同,前面的單詞加上引號(hào):

my %stooges = (
    Moe   => 'Howard',
    Larry => 'Fine',
    Curly => 'Howard',
    Iggy  => 'Pop',
);

哈希在列表環(huán)境中變成鍵/值對(duì)列表。

my @hash_as_an_array = %stooges;
# Contains ( 'Curly', 'Haward', 'Larry', 'Fine', etc... )

正如哈希的鍵和值順序事實(shí)上隨機(jī)的一樣,平展開(kāi)的哈希鍵/值順序也是隨機(jī)的。

利用花括號(hào)訪問(wèn)獨(dú)立的哈希條目

利用花括號(hào)代替中括號(hào)來(lái)獲取哈希的值。

print $stooges{'Iggy'};
# Prints "Pop"

用同樣的方式設(shè)置值:

$stooges{'Shemp'} = 'Howard';

覆蓋現(xiàn)有的值:

$stooges{'Iggy'} = 'Ignatowski';

從哈希中刪除條目:

delete $stooges{'Curly'};

注意:delete?不會(huì)刪除文件。unlink?才會(huì)。

unlink $stooges{'Moe'};
# Deletes a file called 'Howard';

獲取哈希的鍵/值

使用?keys?和?values?關(guān)鍵字:

my @stooge_first_names = keys %stooges;

my @stooge_last_names  = values %stooges;

這會(huì)保證鍵和值的順序相匹配。

哈希鍵自引用單詞

如果你的哈希鍵是單個(gè)詞,那么你不需要引用它。

$stooges{Curly} = 'Howard';

哈希只能包含標(biāo)量

在 Perl 哈希中的值只能是標(biāo)量。它不能包含數(shù)組或數(shù)組中的列表。

$hash{comedians} = @stooges;
# Assigns the length of @stooges to the value

如果你想要在哈希中存儲(chǔ)數(shù)組,你將需要使用引用。

哈希是無(wú)序的

keys %hash?和?values %hash?的順序?qū)嵤律鲜请S機(jī)的。每次執(zhí)行程序都將不同。 它也與添加時(shí)的順序不相關(guān)。

如果你想保留哈希元素添加時(shí)的順序,那么可以使用?Tie::IxHash?模塊。

你無(wú)法排序哈希

在 Perl 中排序哈希的想法不存在,因?yàn)楣J菬o(wú)序的。你可以排序哈希的鍵, 或哈希的值,它們只是列表而已。

使用列表賦值合并哈希

要合并兩個(gè)哈希,將它們看作列表,并賦給哈希。

my %new_hash = (%hash1, %hash2);

等號(hào)右邊是來(lái)自兩個(gè)哈希的鍵/值對(duì)長(zhǎng)列表。然后將該列表賦給?%new_hash。 如果在%hash2?中的任意鍵與?%hash1?中的鍵重復(fù),那么?%hash2?中的鍵/值 對(duì)具有更高的優(yōu)先級(jí),因?yàn)樗鼈冑x值更晚。

何時(shí)使用哈希,何時(shí)使用數(shù)組

如果你做線性、有序的序列,那么使用數(shù)組。

  • 要讀取的文件列表
  • 隊(duì)列中的人列表

如果你做想要查詢的無(wú)序的事,那么使用哈希。

  • 姓索引,通過(guò)名字查詢
  • 顯示文件大小的索引,按名稱查詢

defined?與?exists?的差異

使用?defined?來(lái)看哈希元素是否有?undef?之外的值。如果哈希元素有任意?undef?之外的值,甚至求值為假的 0 和 ""(空字符串),都將返回真。

使用?exists?來(lái)看哈希元素是否已被初始化,即便它沒(méi)有被定義(如,它有值undef)。

my %h;
$h{'foo'} = undef;

defined $h{'foo'} ? print 1 : print 0;
# $h{'foo'} is not defined, so it prints 0
exists $h{'foo'} ? print 1 : print 0;
# but it has been initialized nonetheless, and so this line prints 1

哈希元素僅被定義后才為真。它僅在存在后才能被定義。

然而,哈希元素未被定義仍能存在。這意味著即便它存在,也不會(huì)返回真。

if ( $h{'foo'} ) {
    print 'true';
}
else {
    print 'false';
}
# prints 'false'; since $h{'foo'} is not defined, it cannot be true
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)