5
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);

怎么样?还是不推荐?

4

3 回答 3

3

这将删除每次出现的$myRefin %myHash

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

您可以使用==相同的内存地址来测试引用。

我认为这是一个坏主意,但我在取笑你。

于 2012-08-16T15:44:55.147 回答
1

就目前而言,您必须遍历哈希以查找该引用。或者您可以将密钥添加到数据结构以供将来使用。

于 2012-08-16T15:47:11.770 回答
0

实际上是如何生成新的哈希键的?

线性搜索所有散列值以找到特定引用并绕过散列应该提供的简单快速访问是不好的形式。

写相当于

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

之后你可以做

delete $myHash{$myKey};

但一切都取决于你的真正意思"key". ((~~keys %myHash) + 1)

于 2012-08-16T21:49:45.073 回答