Parameter an Subroutinen in Perl sind immer Call-by-Reference.
Siehe
perlsub, Abschnitt BESCHREIBUNG, dritter Absatz:
QuoteAlle ü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:
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:
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.