Schrift
[thread]6073[/thread]

übergabe Sub: parameter an Sub übergeben

Leser: 1


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Rambo
 2004-02-12 18:22
#80046 #80046
User since
2003-08-14
803 Artikel
BenutzerIn

user image
Hallo,
komme leider nicht weiter, ich möchte die Parameter
die in If schleifen vorkommen an eine Sub weiter geben
und von dort erneut an eine weiter Sub.
Beispiel:
Code: (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
#use strict;
use warnings;

my $t1 = "1";

if ($t1 eq 1){
   $A1 = "Hallo1";
   next1();
  }
  if ($t1 eq 2){
      $A1 = "Hallo2";
      next2();
    }

sub next1{
  print "das ist $A1\n";
  $Z1 = "nix da";
  new1();
  }

sub next2{
  print "das ist $A1\n";
  $Z1 = "nix da";
  new2();
  }
#
sub new1{
  print "das ist $A1 und $Z2 \n";
  }

sub new2{
  print "das ist $A1 und $Z2 \n";
  }

merci
remo
DS
 2004-02-12 18:32
#80047 #80047
User since
2003-08-04
247 Artikel
BenutzerIn
[default_avatar]
???

Um was genau geht's eigentlich?

Parameter-Übergabe:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
&egal('irgend','welche','parameter');

sub egal {
 my @parameter = @_;
 print ++$x, ': ', $_, "
" foreach @parameter;
}


1: irgend
2: welche
3: parameter

Suchst du sowas?

Edit: [ perl ] -> [ code ] (das [ perl ] is schön wenn's geht, aber um so nerviger wenn ned)
Edit: bei [ code ] wird das (ohne Punkte) auch gefiltert... *grrr*
Edit: Ich meine das _END_ mit jeweils 2 Unterstrichen auf beiden Seiten, ich kann das leider nicht so schreiben, weil er es immer filtert, auch wenn ich Leerzeichen oder Punkte dazwischen schreibe, lästig das...\n\n

<!--EDIT|DS|1076604239-->
pktm
 2004-02-12 18:33
#80048 #80048
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Aufruf:
main::next1($Parameter);
Sub:
sub next1 {
my $parameter = shift;
main::next2($parameter);

}
Hoffe das ist es was du wissen wolltest.
mfg pktm
PS: mach strict wieder an ;)
http://www.intergastro-service.de (mein erstes CMS :) )
renee
 2004-02-12 18:34
#80049 #80049
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
erstens Du hast da was von $Z2 in der Ausgabe stehen, gibt es aber sonst nicht (deshalb use strict benutzen ;) )
Du machst auch keine Übergaben, sondern hast globale Variablen.

So würden Übergaben aussehen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use strict;
my $string = 'ja';

if($string eq 'ja'){
my $var = 'test';
next1($var,'hallo');
}

sub next1{
my ($param1,$param2) = @_;
my $var2 = 'Hallo Welt';
print $param2," ",$param1,"\n";
next2($var2);
}

sub next2{
my ($param1) = @_;
print $param1;
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
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/
Rambo
 2004-02-13 10:55
#80051 #80051
User since
2003-08-14
803 Artikel
BenutzerIn

user image
@alle
Vielen herzlichen Danke

@Strat
sollte es mal ein buch von dir geben werde ich es als
erstes kaufen :-)
einfach geniale beschreibung
so was verstehe slbst ich als anfänger!
Merci

remo
Crian
 2004-02-13 13:16
#80052 #80052
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
[quote=Strat,12.02.2004, 17:41]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!)[/quote]
Nicht wirklich, auch die Referenzen werden kopiert, aber das was an einer Referenz interessiert, ist nicht die Adrresse der Referenz (die unterscheidet sich), sondern der Inhalt (nämlich die Adresse dessen, auf was die Referenz verweist).

Indofern hast Du einerseits Recht: wenn man eine Referenz übergibt und sie mit my rauskopiert und dann an dem Objekt etwas ändert, dann ist die Änderung auch in dem aufrufenden Programm zu sehen.

Andererseits aber auch nicht: Denn wenn ich der Referenz einen anderen Wert zuweise (etwa undef), ist das für die aufrufende Funktion völlig unerheblich, deren Referenz verweist immer noch auf das Objekt.

Wenn ich allerdings die übergebene Referenz nicht kopiere (mit my $ref = shift; o.ä.) und auf undef setze (etwa mit $_[0] = undef), dann verweist auch die Referenz des Aufrufers nicht mehr auf das Objekt (und es kann ggf. von der Garbage Collection eingesammelt werden, falls es keine anderen Verweise darauf gibt).

Aber zugegebener Maßen ist das vielleicht nicht der einsteigergeeignetste Hinweis. Aber vielleicht ist er zum Verständnis dennoch nützlich.

(Wobei er nicht an Dich ist @strat, bei Dir gehe ich davon aus, dass ich Dir nicht viel neues erzählen kann, weder in diesem noch in anderen Posts ;-)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Rambo
 2004-02-13 13:27
#80053 #80053
User since
2003-08-14
803 Artikel
BenutzerIn

user image
danke für diese nützlichen hinweise! habe mir
das ganze schon so verewigt das ich es immer
wieder nach lesen kann!
seltsamer weise habe ich bisher diese sachen nicht
in der verständlichkeit im perl buch gefunden.

aber ich hab ja die community das steht so was :-))))))

remo
Strat
 2004-02-17 15:30
#80054 #80054
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Crian,13.02.2004, 12:16]Aber zugegebener Maßen ist das vielleicht nicht der einsteigergeeignetste Hinweis. Aber vielleicht ist er zum Verständnis dennoch nützlich.

(Wobei er nicht an Dich ist @strat, bei Dir gehe ich davon aus, dass ich Dir nicht viel neues erzählen kann, weder in diesem noch in anderen Posts ;-)[/quote]
@Crian: ich habe von dir schon eine Menge gelernt, und hoffe, es auch in Zukunft weiter zu tun. Bei Perl gibt es so viele Sachen, von denen ich keine oder nur wenig Ahnung habe (siehe z.B. die ganzen CPAN-Module, die mir nicht bekannt sind, aber auch so "Kleinigkeiten", die ich nach und nach entdecke, z.B. dass
Code: (dl )
$string = 5."irgendwas"; 

ohne leerzeichen vor dem Punkt keine gute Idee ist (ist mir in einem fremden script mal aufgefallen, weil ich da von Haus aus immer Leerzeichen mache).

Meine Erklaerung ist da wirklich nicht 100% korrekt, aber Rambo kann man es sich so hoffentlich recht gut vorstellen und kommt mit diesem Denkmodell weiter (haette ich dazuschreiben muessen). Ich finde es gut, dass du da meine Erklaerung noch verbessert hast, es lesen ja vielleicht auch andere diesen Thread, fuer die diese "Luege fuer Erwachsene" (siehe Terry Pratchett: Rettet die Rundwelt) nicht mehr ausreichend ist.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Crian
 2004-02-18 11:04
#80055 #80055
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
[quote=Strat,17.02.2004, 14:30]Meine Erklaerung ist da wirklich nicht 100% korrekt, aber Rambo kann man es sich so hoffentlich recht gut vorstellen und kommt mit diesem Denkmodell weiter (haette ich dazuschreiben muessen).[/quote]

Ja, ich hatte mir schon gedacht, dass es als Erklärung erstmal völlig ausreichen würde.

[quote=Strat,17.02.2004, 14:30]Ich finde es gut, dass du da meine Erklaerung noch verbessert hast, es lesen ja vielleicht auch andere diesen Thread, fuer die diese "Luege fuer Erwachsene" (siehe Terry Pratchett: Rettet die Rundwelt) nicht mehr ausreichend ist.[/quote]

Ich habe es erweitert, weil mich am Anfang genau diese "Lüge für Erwachsene" (schöne Bezeichnung dafür btw :-) verwirrte. Da dachte ich immer "hmmm Referenen werden da irgendwie mystisch/magisch anders behandelt" ...rumprobier... *wunder* bis mir klar wurde, dass es eben nur eine vereinfachte Weltanschauung war.

Und wenn man aus der C++-Ecke kommt und schon Pointer und Referenzen kennt, wird die Welt durch die kompliziertere Wahrheit eher einfacher ;-)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2004-02-12 18:22.