2012-08-16 57 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)