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

Parameterübergabe an sub: Wo liegt der Unterschied



<< |< 1 2 >| >> 20 Einträge, 2 Seiten
MartinR
 2005-08-31 13:51
#57554 #57554
User since
2004-06-17
305 Artikel
BenutzerIn
[default_avatar]
Hi,

welche dieser drei Möglichkeiten ist "die Beste" um Paramter an eine sub zu übergeben? Erst mal eine Variable bennen um die dann zu übergeben, als Referenz zu übergeben oder den Wert direkt einzutragen. Mal unabhängig davon ob ich den Variablenwert außerhalb der sub später noch brauche.

Gibt es überhaupt einen Unterschied (Performance, Speicherverbrauch ...)?

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
...
my $abc = 'test';

machwas_1($abc);

machwas_2(\$abc);

machwas_3('test');


sub machwas_1 {
my $xyz = shift;
# ...mach irgend was
}


sub machwas_2 {
my $xyz = shift;
# ...mach irgend was
}


sub machwas_3 {
my $xyz = shift;
# ...mach irgend was
}
...
esskar
 2005-08-31 14:00
#57555 #57555
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
* wenn ich arrays oder hashes übergebe, tendiere ich zu referenzen, wegen speicherverbrauch + speed (by ref)
* scalar über gebe ich by value
* wenn ich $abc außerhalb nicht brauche, dann einfach 'test' übergeben, wegen speicherverbrauch + sinn
murphy
 2005-08-31 14:03
#57556 #57556
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Variante 1 ist 3 hauptsächlich dann vozuziehen, wenn der Wert in irgendeiner Form noch einmal gebraucht wird, oder an einer zentralen Stelle im Code mit anderen Dingen zusammen deklariert werden soll.

Variante 2 würde ich eigentlich nur verwenden, wenn ich entweder verschiedene Typen von Objekten an die Subroutine übergeben können will, oder wenn ich den Wert der übergebenen Variablen aus der Subroutine heraus verändern will.

Über den Unterschied im Speicheraufwand muss man sich an dieser Stelle wohl kaum Gedanken machen, es sei denn es zählt wirklich jedes einzelne Byte RAM-Verbrauch -- wobei man dann mit Perl vermutlich sowieso die falsche Sprache gewählt hätte.
When C++ is your hammer, every problem looks like your thumb.
Strat
 2005-08-31 16:26
#57557 #57557
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
haengt davon ab, was du machen willst; 1 ist call by value, 2 ist call by reference, und 3. ist eigentlich weder noch (aber eher 1). bei grossen strings koennte 2 eine alternative sein; bei kleinen strings verwende ich bevorzugt 1. bei arrays/hashes/komplexeren datenstrukturen/globs/... meistens 2.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Gast Gast
 2005-08-31 16:45
#57558 #57558
Die dritte Variante verwende ich sehr selten, weil es mich immer ärgert, das nachträglich konfigurierbar machen zu müssen.
coax
 2005-08-31 17:30
#57559 #57559
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Die Uebergabe by reference ist ganz nuetzlich wenn du mehrere Listen uebergeben und sie dann auch als separate Listen in der Subroutine brauchst.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
my @buchstaben = ( 'a' .. 'z' );
my @zahlen = ( 0 .. 9 );

process_lists( \@buchstaben, \@zahlen );

sub process_lists {
   my( $buchstaben, $zahlen ) = @_;

   print "Buchstaben: @{$buchstaben}\n";
   print "Zahlen: @{$zahlen}\n";
}

PS: Das Manipulieren von $buchstaben und $zahlen in der Sub wirkt sich dann aber auch auf's original Array aus.\n\n

<!--EDIT|coax|1125495251-->
,,Das perlt aber heute wieder...'' -- Dittsche
Strat
 2005-08-31 18:32
#57560 #57560
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=phaylon,31.08.2005, 14:45]Die dritte Variante verwende ich sehr selten, weil es mich immer ärgert, das nachträglich konfigurierbar machen zu müssen.[/quote]
wirklich? ich verwende die 3. art sogar recht haeufig, z.B. bei CGI:
Code: (dl )
1
2
print $cgi->header(-type => 'text/html');
print $cgi->start_html("Meine Homepage"); # ups, -title vergessen

oder Tk:
Code: (dl )
1
2
$mw->Button(-text => 'Exit', -command => sub { exit })
 ->pack(-side => 'left');


aber ich glaube, ich verstehe, was du meinst... und stimme dir zu\n\n

<!--EDIT|Strat|1125498799-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Gast Gast
 2005-08-31 18:57
#57561 #57561
[quote=Strat,31.08.2005, 16:32]aber ich glaube, ich verstehe, was du meinst... und stimme dir zu[/quote]
Im Zweifelsfall halt lieber dynamisch. Es ist etwas nervig, wenn man ein Update auf 10 Servern fährt, nur weil jemand wo einen Buchstaben anders braucht. Kommt natürlich auch auf's Script an.
MartinR
 2005-09-01 08:45
#57562 #57562
User since
2004-06-17
305 Artikel
BenutzerIn
[default_avatar]
... dann mal ein "Danke an alle" in die Runde ;-)
esskar
 2005-09-01 12:57
#57563 #57563
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=phaylon,31.08.2005, 14:45]Die dritte Variante verwende ich sehr selten, weil es mich immer ärgert, das nachträglich konfigurierbar machen zu müssen.[/quote]
dafür gibt es dann ja aber "use constant"
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2005-08-31 13:51.