Jörk Behrends: Doppelte Werte aus Listen löschen ...

Beitrag lesen

Hallo Ihr!


$array = @array;
for(my $blabla = 0; $blabla < $array; $blabla++ ) {
  ...
  splice @array, ...
  ...
}

slice ändert, wie jede änderung an $_ auch, direkt die globale variable.
deine $array var vorher definiert, also ändert sich nichts daran.
die länge des arrays ändert sich unmittelbar mit dem entfernen des wertes (siehe abs. 1)
$_ wird von slice (wahrscheinlich) nicht beeinflusst. du änderst schließlich @array direkt und nicht den wert des funktionsaufrufs.
eine lösung (wenn auch eine schlechte): wenn ein wert des arrays entfernt wird, ändere manuell $blabla oder $array

Wie sagte Cheatah doch weiter oben???
"warum einfach, wenn's auch kompliziert geht? :-)"

Es ist sicherlich wahr, daß sich das Array sofort verändert, wenn man mit splice drauf los geht. Aber es muß ja nicht gleich zu Problemen führen:
----------------
for(my $blabla = @array; $blabla; $blabla-- ) {
  ...
  splice @array, ...
  ...
}
----------------
Wenn man also das Array von hinten bearbeitet, bekommt gar nicht mit, daß dieses gelegentlich mitschrumpft (bloß nicht nach hinten schauen ;-)

Davon abgesehen wirken natürlich die Hash-Varianten wesentlich geschickter, da man die ganzen (in dieser Splice-Variante ausgelassenen) Vergleiche gar nicht mehr hat. Ebenso entfällt bei geschickter Nutzung die for-Schleife ... hauptsache, man sieht dem Programm noch an, was es eigentlich macht! Und wenn man den Kommentar bemühen muß ;-)

Jörk