Thread Löschen von Hash Elementen-Paar in foreach-Schleife (9 answers)
Opened by yippi at 2014-01-21 01:39

Gast yippi
 2014-01-21 18:50
#173108 #173108
Hallo,

@Linuxer: Das heisst, dass aus der zu Anfang erstellen Liste der Keys, die in der ersten foreach-Schleife erstellt wird, kein Key während des Schleifendurchlaufs gelöscht/verändert werden kann, aber der dazugehörige Wert schon. Das würde es natürlich erklären.

Mein Ziel war eigentlich den Hash zu sortieren und dann alle doppelten Werte sofort, also unmittelbar, herauszulöschen und somit würde sich auch die Anzahl der Schleifendurchläufe in der ersten Foreach-Schleife in diesem Beispiel auf 3 reduzieren. Auf die Schnelle habe ich allerdings sowieso vergessen, den aktuellen Key nicht mit sich selbst vergleichen und zu löschen. Deshalb habe ich ein "next" eingebaut (guckst du Code). Ok zumindest ist es mir jetzt klar warum der Key noch bei der Print-Funktion angezeigt wird und der Wert aber gelöscht wurde, ich hatte nur gedacht dass das eigentlich nicht sein kann weil die beiden untrennbar zusammen gehören, aber wenn die Keys während des foreach-Durchlaufs nicht gelöscht werden können....
Der Code war auch nur ein Beispiel zwecks Verständnis, die eigentliche Hash-Liste ist umfangreich mit sehr langen Keys und Werte ...
Ich werd die bereits gelöschten Keys überspringen, dann fallen die Warnungen weg, schliesslich wird das System auch weniger belastet.
Dank an alle.

Code: (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';

foreach my $key (sort keys %hash)
{
print "\nSchluessel: $key Wert: $hash{$key}";

foreach my $keyvergleich (keys %hash)
{
if($keyvergleich eq $key){next;}

if( $hash{$key} eq $hash{$keyvergleich} )
{
delete $hash{$keyvergleich};
say "\nLoesche $keyvergleich";
}
}
}


gruss
Last edited: 2014-01-21 19:01:37 +0100 (CET)

View full thread Löschen von Hash Elementen-Paar in foreach-Schleife