2011-10-04 40 views
4

所有使用的密鑰應該出現在初始%哈希定義中。如果散列鍵在初始散列定義中沒有定義,是否有辦法讓perl編譯失敗?

use strict; 
my %hash = ('key1' => 'abcd', 'key2' => 'efgh'); 
$hash{'key3'} = '1234'; ## <== I'd like for these to fail at compilation. 
$hash{'key4'}; ## <== I'd like for these to fail at compilation. 

有沒有辦法做到這一點?

+0

有一種叫做類的東西。你可能需要這個。 –

+0

您可以批准答案的時間。 – DavidO

回答

5

Tie::StrictHash在嘗試分配新的散列鍵時死亡,但它在運行時而不是編譯時死亡。

+1

所以它聽起來像標準Hash :: Util :: lock_keys函數一樣。 –

+0

+1 @davorg:我很確定Core中有些東西,但我的搜索功能很弱。 – toolic

-4
use strict; 
my %hash = ('key1' => 'abcd', 'key2' => 'efgh'); 
my $ke = 'key3'; 
if (!exists $hash{$ke}) { 
exit; 
} 
+3

如果你確實需要在編譯時使用它,把它放在'BEGIN'塊中。 – tripleee

+2

-1:這要求您在每次使用散列時手動測試每個散列鍵的存在性,這與問題希望使用不存在的鍵自動失敗的願望是相反的。 –

8

模塊Hash::Util自5.8.0以來一直是Perl的一部分。這包括一個'lock_keys'函數,它可以用來實現你想要的東西。如果您嘗試將密鑰添加到散列,它會給出運行時(不是編譯時)錯誤。

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

use Hash::Util 'lock_keys'; 

my %hash = (key1 => 'abcd', key2 => 'efgh'); 
lock_keys(%hash); 
$hash{key3} = '1234'; ## <== I'd like for these to fail at compilation. 
say $hash{key4}; ## <== I'd like for these to fail at compilation. 
相關問題