Search code examples
perlperl-hash

Perl Delete Base Key through Hash Reference


my %myHash = (
    key1 => {
        test1 => 1,
        test2 => 2,
    },
    key2 => {
        test1 => 3,
        test2 => 4,
    },
);

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

Humor me and assume the above is actually practical. How is it I can delete this newly created key through the reference?

delete $myRef;

Obviously doesn't work

EDIT: So from zostay I have the following...

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

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

Usage:

deleteRef(\%myHash, $myRef);

How's that? Still not recommended?


Solution

  • This will delete every occurrence of $myRef in %myHash:

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

    You can use == to test for references using the same memory address.

    I think this is a bad idea, but I am humoring you.