ubuntuusers.de

Perl Call by value

Status: Gelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

Saddy

Anmeldungsdatum:
2. Mai 2006

Beiträge: 1148

Hallo,

mir ist da etwas aufgefallen, folgendes Bsp.:

#!/usr/bin/perl

sub a {
	$_[0] =~ s/F/D/g;
}

my $b = "FFJFF";
a($b);
print $b;

DDJDD

Ich dachte, ich würde die Variable $b per value übergeben. Anscheinend nicht. Warum?

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Saddy schrieb:

Ich dachte, ich würde die Variable $b per value übergeben. Anscheinend nicht. Warum?

Weil Perl alles mittels Call-by-Reference übergibt. Wenn du mit Kopien arbeiten möchtest musst du "@_" entpacken.

my ( $foo, $bar, $baz ) = @_;

Saddy

(Themenstarter)

Anmeldungsdatum:
2. Mai 2006

Beiträge: 1148

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Saddy schrieb:

Oha. Dann ist das hier http://www.privatrecht.sbg.ac.at/perl-tutorial/perl/perl_ref.html falsch erklärt.

Ja ist es. Perl nutzt intern Call By Rerference. Daher Editiert man die Werte direkt in @_ editiert man das Original. Das ist aber nicht zu verwechseln mit Referenzen in Perl. "Call by Reference" ist in diesem Sinne nur Intern, also man sieht die Referenzen nicht. Referenzen an sich sind in Perl sichtbar und bilden eine eigenen Datentyp. Bei Zuweisungen Kopiert man allerdiengs immer. Dadurch das man am anfang einer Funktion sowieso immer @_ entpackt glauben wohl einige der Aufruf wäre Call by Value.

Das Konzeot findest du auch woanders. Zum Beispiel bei einer for Schleife. Hier hast du in diesem Sinne auch "Call by Reference" Die Zählervariable ist praktisch ein Alias zum Original. Ändert du etwas änderst du das original ebenfalls.

my @foo = (1, 2, 3);
for my $i ( @foo ) {
  $i = $i * 2;
}

Also nach dem ausfpüren steht in @foo dann "2, 4, 6". map(), und grep() arbeiten ebenfalls mit solchen Aliase. Aber wie gesagt das ist alles letztendlich Perl Intern. Das hat nichts mit dem Thema Referenzen in Perl direkt zu tun. Den bei diesen Sachen arbeitet man nicht mit den Referenzen. "call By Reference" sagt ja nur aus in welcher Art Werte übergeben werden.

Diese ganzen Ausdrücke sind wohl alle etwas unglücklich da sie zu wenig differenzieren.

Antworten |