2012-08-16 9 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, 
};  

Humor mich und nehme an, das Obige ist tatsächlich praktisch. Wie kann ich diesen neu erstellten Schlüssel durch die Referenz löschen?Perl Basisschlüssel löschen durch Hash Referenz

delete $myRef; 

funktioniert offensichtlich nicht

EDIT: So von zostay ich folgendes haben ...

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

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

Verbrauch:

deleteRef(\%myHash, $myRef); 

Wie ist das? Immer noch nicht zu empfehlen? Adresse

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

Sie == prüfen können, für Referenzen mit der gleichen Speicher:

Antwort

3

jedes Vorkommen von $myRef in %myHash löscht Dies wird.

Ich denke, das ist eine schlechte Idee, aber ich hole dich.

+0

I So verwende einen Verweis auf einen Hash-Schlüssel, um die "Typisierung" zu reduzieren, da ich in vielen Zeilen auf Hash-Hash-Werte zugreife. Was denkst du über das Unterprogramm? –

+0

Das Sub ist in Ordnung. Ich empfehle Referenzvergleiche nicht, weil solche Dinge fast immer besser gelöst werden können. Allerdings ist die Definition von "besser" Gegenstand der Debatte und das eigentliche Problem, das Sie versuchen zu lösen. Ohne das eigentliche Problem zu kennen, habe ich keine Ahnung, was eine bessere Lösung wäre. – zostay

1

Wie es aussieht, müssen Sie durch die Hash-Suche nach diesem Verweis durchlaufen. Oder Sie können den Schlüssel zur zukünftigen Verwendung in die Datenstruktur einfügen.

0

Wie geht es Ihnen tatsächlich Generierung des neuen Hash-Schlüssels?

Es ist eine schlechte Form, linear durch alle Hash-Werte zu suchen, um eine bestimmte Referenz zu finden und umgeht den einfachen schnellen Zugriff, den Hashes bieten soll.

Es würde viel mehr Sinn machen das Äquivalent von

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

zu schreiben, nach dem Sie gerade

tun konnte
delete $myHash{$myKey}; 

aber alles hängt davon ab, was Sie meinen wirklich von "key". ((~~keys %myHash) + 1)