Thread übergabe Sub: parameter an Sub übergeben (12 answers)
Opened by Rambo at 2004-02-12 18:22

Strat
 2004-02-12 18:41
#80050 #80050
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
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:
Code (perl): (dl )
1
2
3
4
&Subroutine(%hash);
sub Subroutine {
  my %hash = @_;
}

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:
Code (perl): (dl )
1
2
3
4
&Subroutine(%hash1, %hash2);
sub Subroutine {
  my (%h1, %h2) = @_;
}

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/

View full thread übergabe Sub: parameter an Sub übergeben