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

Parameterübergabe an eine Funktion

Reader: 1


<< >> 8 entries, 1 page
GwenDragon
 2005-03-15 16:26
#52698 #52698
User since
2005-01-17
14666 articles
Admin1
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#Beispiel:
sub testfunc (\@\@) {
my @a1 = @{shift() };
my @a2 = @{shift() };

return "\@1=@a1\n", "\@2=@a2\n"
}

my @array1 = qw (1 2 3);
my @array2 = qw (A B C);

print testfunc( @array1, @array2);
\n\n

<!--EDIT|GwenDragon|1110896999-->
OnkelBlacky
 2005-03-15 16:07
#52699 #52699
User since
2004-08-20
16 articles
BenutzerIn
[default_avatar]
Hallo,

ich mal wieder ne,

In meinem Perlskript habe ich zwei funktionen die mir ein aray zurückliefern. das klappt soweit

diese möchte an eine neue Funktion übergebeben

sub testfunktion (@@)
{
my @array1= ??;
my @array2=??;

}

wie muss ich die Parameter übergeben, das @array1 und @array2 mit daten gefüllt werden.

vielen dank torsten
Relais
 2005-03-15 16:32
#52700 #52700
User since
2003-08-06
2244 articles
ModeratorIn
[Homepage] [default_avatar]
Das ist eine FAQ: Wie kann man ein oder mehrere Arrays an eine Subroutine übergeben?

Und da es mit CGI nix zu tun hat, nach Allgemeines verschoben.
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
Ronnie
 2005-03-15 17:39
#52701 #52701
User since
2003-08-14
2022 articles
BenutzerIn
[default_avatar]
Man kann auch alles in ein anonymes Hash stopfen:
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
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my @numbers = (1..10);
my @words = qw(hello world outside);

function( {NUMBERS=>\@numbers , WORDS=>\@words} );
exit;

sub function {
die "Keine Parameter übergeben!\n" unless @_;
my %opt = %{ shift @_ };
print Dumper \%opt;

my @i_words = $opt{WORDS};
print Dumper \@i_words;

my @i_numbers = $opt{NUMBERS};
print Dumper \@i_numbers;
}
\n\n

<!--EDIT|Ronnie|1110908950-->
pKai
 2005-03-15 23:11
#52702 #52702
User since
2005-02-18
357 articles
BenutzerIn
[default_avatar]
Also das was in dem FAQ-Artikel steht ist mir klar. Auch die Technik von Ronnie... klein Problem.
Überrascht hat mich allerdings der Code, den Gwendragon gepostet hat.
Ich muss dazu sagen, dass ich mich trotz 10 (mehr oder weniger intensiven) Jahren mit Perl bisher Null mit Prototypen (in perl) befasst habe. :blush:
Also normalerweise ist, wenn ich sowas wie
...( @array1, @array2)
sehe klar, das hier 2 arrays in einer neuen Liste aufgehen, also nachher die Grenze zwischen den beiden nicht mehr identifizierbar ist.
Durch den Prototyp "(\@\@)" werden aber offenbar auf die an die sub übergebenen Arrays (implizit) Referenzen gebildet?!
Sehr interessant, muss ich mir wohl doch mal genauer zu Gemüte führen.
Kann mir jemand bitte 'ne online Fundstelle nennen, wo ich das kompakt nachlesen kann!
Danke!
I sense a soul in search of answers.
renee
 2005-03-15 23:59
#52703 #52703
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Würde man wohl eher als ($$) schreiben, denn Referenzen sind Skalare...\n\n

<!--EDIT|renee|1110924041-->
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/
pq
 2005-03-16 00:34
#52704 #52704
User since
2003-08-04
12208 articles
Admin1
[Homepage]
user image
Wiki:perlsub -> Prototypes
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
Dubu
 2005-03-16 12:10
#52705 #52705
User since
2003-08-04
2145 articles
ModeratorIn + EditorIn

user image
[quote=renee,15.03.2005, 22:59]Würde man wohl eher als ($$) schreiben, denn Referenzen sind Skalare...[/quote]
Das macht aber einen gewaltigen Unterschied!

Wenn der Prototyp sub foo ($$) lautet, dann werden wirklich zwei Skalare erwartet, d.h. wenn du zwei Arrays angibst, werden nur die ersten beiden Werte des ersten Arrays uebergeben. (Es gibt leider keine Fehlermeldung, weil Prototypen nur waehrend der Kompilationsphase geprueft werden, und da steht ja noch nicht fest, wie viele Elemente die Arrays enthalten, d.h. wieviele Argumente die Funktion tatsaechlich bekommt.)

Wenn der Prototyp dagegen sub foo (\@\@) lautet, dann muessen zwei Arrays als Argumente angegeben werden, d.h. zweimal etwas, das mit einem '@' anfaengt. Es werden dann automatisch Referenzen auf diese Arrays uebergeben.
<< >> 8 entries, 1 page



View all threads created 2005-03-15 16:26.