Thread übergabe Sub: parameter an Sub übergeben
(12 answers)
Opened by Rambo at 2004-02-12 18:22
Also Parameter in eine Sub reinuebergeben funktioniert folgendermaszen:
Code (perl): (dl
)
1 2 3 4 5 &Subroutine($param1, $param2); sub Subroutine { # parameter landen in @_ my ($p1, $p2) = @_; # hierher copiert } # Subroutine also z.B. Code (perl): (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 27 28 29 30 31 32 33 34 my $t1 = 1; # ist ja eine zahl, keine zeichenkette: keine "1" if ($t1 == 1) { # ist zahl, deshalb == und nicht eq my $a1 = "Hallo1"; &next1($t1, $a1); } # $t1 kann nur entweder 1 oder 2 sein, nicht beides, deshalb # sparen wir durch das elsif eventuell eine abfrage elsif ($t1 == 2) { my $a1 = "Hallo2"; &next2($t1, $a2); } # -------------------------------------- sub next1 { my ($t1, $a1) = @_; my $z1 = "nix da 1"; &new1($a1, $z1); } # next1 # -------------------------------------- sub next2 { my ($t1, $a1) = @_; my $z1 = "nix da 2"; &new2($a1, $z1); } # next2 # -------------------------------------- sub new1 { my ($a1, $z1) = @_; print "das ist '$a1' und '$z1'\n"; } # new1 # -------------------------------------- sub new2 { my ($a1, $z1) = @_; print "das ist '$a1' und '$z1'\n"; } # new2 # -------------------------------------- Wenn du elemente der Uebergabeparameterliste @_ direkt veraenderst, veraenderst du die uebergebenen Werte (call by reference). Wenn du etwas herauskopierst my ($a1, $z1), dann bekommst du lokale Variablen und Werte, die nur innerhalb der sub existieren (Call by value) (Ausnahme: Referenzen!) Achtung bei der Uebergabe von Arrays oder Hashes: geht gut, weil %hash da in eine Liste umgewandelt wird, und nachher wieder zurueckgewandelt. Es geht jedoch nicht mit zwei Hashes (oder Listen), weil da der Anfang verloren geht: hier enthaelt %h1 alle werte (auch die von %hash2), waehrend %h2 leer ist, weil Perl da nicht weiss, wo die Grenzen zwischen den beiden sind und so alles dem ersten zuweist. Wenn du trotzdem mehrere Hashes und/oder Listen uebergeben willst, musst du das per Referenz machen, siehe die Kapitel Referenzen und Subroutinen aus meiner Einfuehrung in Perl auf http://www.fabiani.net/ -> Vortraege -> Einfuehrung in Perl perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/ |