my %myHash = (
key1 => {
test1 => 1,
test2 => 2,
},
key2 => {
test1 => 3,
test2 => 4,
},
);
my $myRef = $myHash{ "key". ((~~keys %myHash) + 1) } //= {
test1 => 5,
test2 => 6,
};
幽默我,并假设上述内容实际上是实用的。我怎么能通过引用删除这个新创建的密钥?
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);
怎么样?还是不推荐?
答案 0 :(得分:3)
这将删除$myRef
中%myHash
的每次出现:
for my $key (keys %myHash) {
if ($myHash{$key} == $myRef) {
delete $myHash{$key};
}
}
您可以使用==
来测试使用相同内存地址的引用。
我认为这是一个坏主意,但我在嘲笑你。
答案 1 :(得分:1)
就目前而言,你必须遍历哈希寻找那个引用。或者您可以将数据键添加到数据结构中以供将来使用。
答案 2 :(得分:0)
你如何实际生成新的哈希密钥?
通过线性搜索所有哈希值来查找特定引用并绕过哈希应该提供的简单快速访问是不好的形式。
编写等效的
会更有意义my $myKey = "key". ((~~keys %myHash) + 1);
$myHash{$myKey} //= {
test1 => 5,
test2 => 6,
};
之后你可以做
delete $myHash{$myKey};
但是一切都取决于"key". ((~~keys %myHash) + 1)