Schrift
[thread]7915[/thread]

Subroutinen und listen als Parameter.



<< |< 1 2 >| >> 17 Einträge, 2 Seiten
toby
 2006-04-22 13:39
#65204 #65204
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Hi,

um eine eigne Funktion (subroutine) möglichst universell zu schreiben, sollen möglichst alle Variablen als Parameter der Funktoin übregeben werden. Wie kann man aber mehr als eine Liste übergeben ? Wenn ich nämlich $x=subroutine($var_a,@list_a,$var_b,@list_b) übergebe, wird alles, was nach @list_a kommt, in der aufgerufener Funktion in eine grosse Liste reigepackt.

Wie übergebe ich also mehrere Listen als Funktionsargumente/parameter ?

Danke
Tobias
Ronnie
 2006-04-22 13:42
#65205 #65205
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
übergib Referenzen perlref:
Code: (dl )
$x=subroutine($var_a,\@list_a,$var_b,\@list_b)
pq
 2006-04-22 14:32
#65206 #65206
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
der tip wäre auch in perlsub nachzulesen gewesen.
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
toby
 2006-04-22 15:41
#65207 #65207
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Hi :)

Quote
If you want to pass more than one array or hash into a function--or return them from it--and have them maintain their integrity, then you're going to have to use an explicit pass-by-reference.


Danke schön! :)
Tobias
murphy
 2006-04-22 17:38
#65208 #65208
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Ronnie,22.04.2006, 10:42]übergib Referenzen perlref:
Code: (dl )
$x=subroutine($var_a,\@list_a,$var_b,\@list_b)
[/quote]
... oder benutze Prototypen. Wenn du die besagte Routine als
Code: (dl )
sub subroutine($\@$\@) { ... }
definierst, dann kannst du sie auch einfach als
Code: (dl )
$x = subroutine($var_a, @list_a, $var_b, @list_b)
aufrufen.

Im Prinzip unterscheidet sich diese Lösung von der expliziten Angabe der Referenzen aber nur dadurch, dass Perl das Erstellen der Referenzen hier automatisch erledigt. Es handelt sich also um syntaktischen Zucker -- und der ist eine Geschmackssache ;-)
When C++ is your hammer, every problem looks like your thumb.
Matze
 2006-04-22 23:27
#65209 #65209
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Und falls du noch nicht mit Referenzen gearbeitet hast, oder
es nicht möchtest, und auch keine Prototypen verwenden
möchtest, dann kannst du Arrays, wie schon geschrieben, als
Referenzen übergeben, und folgendermaßen auffangen, um sie
trotzdem als normale Arrays verwenden zu
können:
Code: (dl )
1
2
3
4
5
6
7
8
sub subroutine {
  my $var_a = shift;
  my *arr_a = shift;
  my $var_b = shift;
  my *arr_b = shift;

  #...
}

Das funktioniert natürlich auch mit Hashes/... .

MfG. Matze
Mit freundlichen Grüßen: Matze
pq
 2006-04-23 00:15
#65210 #65210
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Code: (dl )
1
2
syntax error at -e line 4, near "my *arr_a"
syntax error at -e line 6, near "my *arr_b"
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
Matze
 2006-04-23 13:46
#65211 #65211
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Entschuldige, mir my() funktioniert es ja nicht, aber mit local:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl
#
my $a = "abc";
my $b = "123";
my @a = qw(a b c);
my @b = qw(1 2 3);

subroutine($a,\@a,$b,\@b);

sub subroutine {
local ($sa,*aa,$sb,*ab) = (@_);

print "$sa\n$sb\n";
print "@aa\n@ab\n";
}

Das funktioniert!

Allerdings weiß ich nicht mehr, wie man 'use strict' miteinbinden
kann damit es auch dann noch funktioniert. :(
Ich werde mich aber nochmal erkundigen.

MfG. Matze
Mit freundlichen Grüßen: Matze
renee
 2006-04-23 15:09
#65212 #65212
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du könntest z.B. strict nur für die sub subroutine ausschalten:
Code: (dl )
1
2
3
4
sub subroutine{
no strict;
[...]
}
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/
Dubu
 2006-04-23 15:44
#65213 #65213
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Na, aber ehrlich! Solche empfindlichen Konstruktionen mit Typeglobs sollte man doch keinem Anfänger präsentieren.

Auch Prototypen sollte man IMHO erst einsetzen, wenn man etwas sattelfest ist. Man schießt sich sonst doch schnell in den Fuß. Und Typeglobs sind so selten nötig, dass ich bisher komplett ohne ausgekommen bin (dank FileHandle z.B.).
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2006-04-22 13:39.