Thread Parameteränderung bei Funktion (12 answers)
Opened by Fraser at 2005-01-11 18:41

Dubu
 2005-01-12 14:08
#50713 #50713
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Parameter an Subroutinen in Perl sind immer Call-by-Reference.
Siehe perlsub, Abschnitt BESCHREIBUNG, dritter Absatz:
Quote
Alle übergebenen Argumente befinden sich im Array @_ . Bei zwei Argumenten wären diese also in $_[0] und $_[1] gespeichert. @_ ist ein lokales Array, allerdings sind die Elemente Aliase für die originalen Parameter. D.h., wenn das Element $_[0] verändert wird, wird das entsprechende Original auch verändert (oder wenn es nicht veränderbar ist, tritt ein Fehler auf).

Wenn man das vermeiden moechte, muss man vor dem Bearbeiten oder beim Bearbeiten eine lokale Kopie der Daten anlegen:
Code: (dl )
1
2
3
4
sub foo {
   my @data = @_;    # Kopie anlegen
   # jetzt kann man mit @data arbeiten
}

Natuerlich muss man dabei beruecksichtigen, dass der Platz fuer das Array dann zweimal benoetigt wird.

Aehnlich funktioniert auch die for-Schleife, wie in deinem Beispiel:
Code: (dl )
1
2
3
for (@array) {
   $_ *= $faktor;    # $_ ist ein Alias fuer das Element in @array
}
Hier wird nicht nur die Variable $_ lokal geaendert, sondern gleichzeitig auch das korrespondierende Element in @array.

View full thread Parameteränderung bei Funktion