2012-08-16 56 views
5
my %myHash = (
    key1 => { 
     test1 => 1, 
     test2 => 2, 
    }, 
    key2 => { 
     test1 => 3, 
     test2 => 4, 
    }, 
); 

my $myRef = $myHash{ "key". ((~~keys %myHash) + 1) } //= { 
    test1 => 5, 
    test2 => 6, 
};  

幽默我,並假設上述是實際的。我怎麼能通過引用刪除這個新創建的密鑰?Perl通過哈希刪除基本密鑰參考

delete $myRef; 

顯然行不通

編輯: 所以從zostay我有以下...

sub deleteRef { 
    my ($hash_var, $hash_ref) = @_; 

    for (keys %$hash_var) { 
     delete $hash_var->{$_} if ($hash_var->{$_} == $hash_ref); 
    } 
} 

用法:

deleteRef(\%myHash, $myRef); 

這麼如何?仍然不推薦?

回答

3

這將刪除的$myRef每次出現在%myHash

for my $key (keys %myHash) { 
    if ($myHash{$key} == $myRef) { 
     delete $myHash{$key}; 
    } 
} 

您可以使用==來測試使用相同的內存地址的引用。

我認爲這是一個壞主意,但我很欣賞你。

+0

所以,我的意思是因爲我正在訪問許多行上的散列哈希值,所以使用對散列鍵的引用來減少「類型」。你對子程序有什麼看法? – 2012-08-16 17:14:51

+0

該子很好。我不建議做參考比較,因爲這樣的事情幾乎可以普遍得到更好的解決。然而,「更好」的定義是需要辯論的,也是你試圖解決的實際問題。不知道實際的問題,我不知道什麼是更好的解決方案。 – zostay 2012-08-16 17:31:59

1

就目前而言,您必須循環查找該引用的散列。或者您可以將數字鍵添加到數據結構以供將來使用。

0

你怎麼樣實際上生成新的哈希鍵?

通過線性搜索所有散列值來查找特定引用並繞過散列應提供的簡單快速訪問是一種糟糕的形式。

它將使更多的意義寫的

my $myKey = "key". ((~~keys %myHash) + 1); 
$myHash{$myKey} //= { 
    test1 => 5, 
    test2 => 6, 
}; 

之後,你可能只是做

delete $myHash{$myKey}; 

等價,但一切都取決於你真的"key". ((~~keys %myHash) + 1)