通过哈希引用删除Perl基键

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

这样怎么样?还是不推荐吗?
3个回答

3
这将删除%myHash中每个$myRef的出现:
for my $key (keys %myHash) {
    if ($myHash{$key} == $myRef) {
        delete $myHash{$key};
    }
}

你可以使用==来测试是否引用了相同的内存地址。

我认为这不是个好主意,但是我会迎合你。


所以我正在使用哈希键的引用来减少“类型化”,因为我在多行访问哈希的哈希。你觉得这个子程序怎么样? - Jonathan Walker Sr.
这个子程序没问题。我不推荐进行引用比较,因为这种事情几乎普遍可以更好地解决。然而,“更好”一词的定义是有争议的,要看你正试图解决的实际问题。如果不知道实际问题是什么,我就不知道更好的解决方案是什么。 - zostay

1

目前来看,您需要循环遍历哈希表以查找该引用。或者,您可以将该键添加到数据结构中以备将来使用。


0
你是如何实际生成新的哈希键的?
线性搜索所有哈希值以查找特定引用是不好的形式,也绕过了哈希应该提供的简单快速访问。
编写相当于...的等效代码将更有意义。
my $myKey = "key". ((~~keys %myHash) + 1);
$myHash{$myKey} //= {
    test1 => 5,
    test2 => 6,
};

之后你只需要这样做

delete $myHash{$myKey};

但是一切都取决于你对"key". ((~~keys %myHash) + 1)的真正含义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接