Thread Löschen von Hash Elementen-Paar in foreach-Schleife
(9 answers)
Opened by yippi at 2014-01-21 01:39
Für den Hash betrachtet, ist das Key/Value-Paar komplett gelöscht.
Die äußere Schleife iteriert über eine eigene Liste, die nach der Erstellung unabhängig vom Hash ist. Dein Print versucht dann mit einem nicht (mehr) vorhandenen Key einen Wert aus dem Hash zu holen; das ergibt ein undef (was mit eingeschalteten Warnungen zu sehen ist) und wird als Leerstring ausgegeben. Der Key ist auch nicht mehr da, die Ausgabe erfolgt mit $key, das aus der unabhängigen Liste stammt. Woran wird denn festgemacht, dass der Eintrag für Schlüssel "cc" gelöscht werden soll; warum nicht "aa"? Edit: Wenn Deine Keys/Values sehr lang sind und viele sind, dann ist der folgende aufgezeigte Weg u.U. recht speicherintensiv, weil teilweise mit internen Listen gearbeitet wird, die eben ihren Platz brauchen./Edit Wenn Du einfach doppelte Werte entfernen willst, dann schau Dir mal folgende FAQ an: http://perldoc.perl.org/perlfaq4.html#How-can-I-re... Ansatz: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #!/usr/bin/perl use strict; use warnings; use 5.010; my %hash; $hash{aa}='test1'; $hash{bb}='test2'; $hash{cc}='test1'; $hash{dd}='test3'; my %seen; # ermittle die Keys, deren Werte schon bekannt sind my @keys = grep { $seen{ $hash{$_} }++ } sort keys %hash; # Kontrolle "doppelte keys" print "$_ : $hash{$_}\n" for @keys; # Loesche diese Keys delete @hash{@keys}; # Kontrolle 2 use Data::Dumper; print Dumper \%hash; Last edited: 2014-01-21 19:23:41 +0100 (CET) meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen! |