Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6956[/thread]

parameter-übergabe an funktionen

Leser: 1


<< >> 9 Einträge, 1 Seite
supersucker
 2005-05-03 23:59
#54526 #54526
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
hi,

ich werd nicht ganz schlau draus wie ich in perl an funktionen parameter übergebe, bisher hab ich das bei funktionen in der gleichen datei immer so gemacht:

Code: (dl )
1
2
3
4
5
6
sub tuwas ()
{
our $param1 = shift;
our $param2 = shift;
..........................
}


und bei funktionen die ich aus eigenen modulen heraus aufgerufen habe:

Code: (dl )
1
2
3
4
5
6
sub tuwas (@)
{
our $param1 = shift;
our $param2 = shift;
..........................
}



was ist aber nun wenn ich der funktion z.B. zwei arrays übergeben möchte, also so:
Code: (dl )
1
2
3
4
sub tuwas (@@)
{
..........................
}


dann kann ich ja nicht sowas wie
Code: (dl )
1
2
    our $param1 = shift;    
our $param2 = shift;

machen um auf die array zuzugreifen, wie sprech ich die dann an?

oder kann ich die übergebenen arrays auch benennen und dran drauf zugreifen, also z.B. so:
Code: (dl )
1
2
3
4
5
6
sub tuwas (@array1, @array2)
{
my $param1 = @array1;
my $param2 = @array2;
..........................
}


danke im voraus.......
sri
 2005-05-04 00:12
#54527 #54527
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das Geheimnis hier sind referenzen.

Code: (dl )
1
2
3
4
5
6
foo(\@array1, \@array2);

sub foo {
   my @array1 = @{shift};
   my @array2 = @{shift};
}


Und um himmels willen, vergiss prototypen und benutze kein our solange du nicht weisst wofuer es gut ist! ;)
pktm
 2005-05-04 00:12
#54528 #54528
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Erstmal: du kannst laut meinem Buch nur ein Array / einen Hash an eine Sub übergeben, und die muss dann als letzter Parameter übergeben werden.
Wenn du mehrere nicht-scalare, also Arrays und Hashes übergeben möchtest solltest du Referenzen benutzen.
my $aref = \@array;
my $href = \%hash;
Die kannst du dann wie normale Scalare in der Sub auslesen:
sub machwas {
 my $param1 = shift;
 my $param2 = shift;
}

Oder wenn du gleich ganze Listen an Parametern haben möchtest:
sub machwas {
 my ($p1, $p2) = @_;
}

Wo genau der Unterschied besteht kann ich dir leider nicht erklären, das liest du besser in der Doku nach. (perlref, perlsub)

Hoffe das hat geholfen,
mfg pktm

EDIT: da war wer schneller... und hat eine kürzere Antwort gebracht...
Na toll! :P\n\n

<!--EDIT|pktm|1115151257-->
http://www.intergastro-service.de (mein erstes CMS :) )
Froschpopo
 2005-05-04 00:49
#54529 #54529
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
aber du kannst ja nur mit shift das erste element auslesen, zweimal shift ergibt dann aiuch zweimal dasselbe ergebnis.

Code: (dl )
my ($scalar, $list_ref) = @_;

$scalar kannst du normal lesen, $array ist ne Referenz auf die du z.b. so zugreifen kannst: $$list_ref[index].
Beim Hash dasselbe, wobei ein Hash ja im grunde nichts weiter als ein Array ist: $list_ref->{key}

Ich hab jetzt nicht getestet ob es funktioniert, aber ich stelle einfach mal die theorie in den Raum, dass du auch mehrere Listen übergeben kannst an die du dann z.b. so rankommen könntest:
Code: (dl )
1
2
# beispiel für mehrere Hash-refs:
$list_ref[ArrayIndex]->{key}

(ungetestet)
pq
 2005-05-04 01:40
#54530 #54530
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
und bitte nur my() verwenden. our() ist hier völlig fehl am platz.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
sri
 2005-05-04 03:14
#54531 #54531
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Froschpopo,03.05.2005, 22:49]aber du kannst ja nur mit shift das erste element auslesen, zweimal shift ergibt dann aiuch zweimal dasselbe ergebnis.
[/quote]

FALSCH!

[quote=Froschpopo,03.05.2005, 22:49]

Beim Hash dasselbe, wobei ein Hash ja im grunde nichts weiter als ein Array ist
[/quote]

FALSCH!

[quote=Froschpopo,03.05.2005, 22:49]

Code: (dl )
1
2
# beispiel für mehrere Hash-refs:
$list_ref[ArrayIndex]->{key}

[/quote]

FALSCH!
pKai
 2005-05-04 11:39
#54532 #54532
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Auch perlsub (zwar bisher nur teilweise Deutsch, aber die ersten Abschnitte, die bereits übersetzt sind) sollte dir weiterhelfen.
I sense a soul in search of answers.
Crian
 2005-05-04 12:41
#54533 #54533
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
sowas ähnliches wie sri wollte ich auch gerade sagen :D
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
Strat
 2005-05-04 17:30
#54534 #54534
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn dich naeheres dazu interessiert, schau dir mal auf meiner HP -> Vortraege -> "Einfuehrung in Perl" die Kapitel Subroutinen bis Uebergabeparameter an; da lernst du, wie es einfach mit Referenzen funktioniert...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 9 Einträge, 1 Seite



View all threads created 2005-05-03 23:59.