2013-06-13 82 views
5

如何將數組(如下例所示的數組)放入Perl中的哈希中?我試過用數組引用,但它不起作用。我如何使它工作?我希望通過執行散列(除此之外)實質上去除重複。使用數組作爲鍵創建Perl哈希

+0

你需要設計自己的哈希算法爲你的陣列,然後用它作爲你的鑰匙。 –

+0

你能舉個例子嗎? –

+0

這不可能:所有密鑰都必須是字符串。但是,您可以連接數組的各個部分以形成一個可以保證不會出現在值中的字符。這可能是一個NUL字節:'$ h {join「\ x00」,@a} = 1'。 – amon

回答

9

正則散列只能有字符串鍵,所以你需要爲你的數組創建一些散列函數。簡單的方法是簡單地將數組元素(例如join

$h{join('-', @a)} = \@a; # A nice readable separator 
$h{join($;, @a)} = \@a; # A less likely, configurable separator ("\034") 

但是這種方法(使用sentinel值)要求你選擇一個在鍵中找不到的字符。下列不從問題的困擾:

$h{pack('(j/a*)*', @a)} = \@a; 

另外,檢查出Hash::MultiKey可以採取更復雜的關鍵。

+0

我添加了一些更多的細節。我希望你不介意。 – ikegami

3

我試着用數組引用,但它不工作

搞笑的是,(新)駱駝書的361頁有一個段落標題: 引用不工作作爲哈希鍵

所以,你證明了駱駝書是正確的。然後它繼續告訴你如何解決它,使用Tie::RefHash

我想你應該買這本書。 (順便說一下,(1,1)可能被稱爲Python中的元組,但它在Perl中被稱爲列表)。

1

要使用哈希刪除陣列式兩份:

my %hash; 
@hash{@array} = @array; 
my @unique = keys %hash; 

或者,您可以使用map創建哈希:

my %hash = map {$_ => 1} @array; 
+0

-1:不解決OP無法將非標量值用作散列鍵的問題。 –

+0

我不同意。它處理他真正的問題(在帖子結尾處),即使用散列來重新排列數組。這向我建議他將數組設置爲散列鍵來達到的目的是將數組中的每個元素分配爲散列中的單獨鍵。 – stevenl

+0

同意它展示瞭如何使用哈希去重數據集,但是我讀到的問題是集合中的數據元素是元組,而不是每個元組的元素。所以,如果他不能使用元組作爲鍵,那麼使用'keys'去除重複是不可能的。 OP可能會澄清他究竟是在扣除什麼? –