Schrift
[thread]7483[/thread]

übergabe eines hash an sub

Leser: 1


<< >> 7 Einträge, 1 Seite
d4mi4n
 2005-11-19 02:18
#60247 #60247
User since
2004-07-28
4 Artikel
BenutzerIn
[default_avatar]
hi,
ich habe heute versucht eine funktion zu erstellen an die ich einen hash übergebe, schreibe ich beim prototypen der funktion sub foo (%) kann ich kein $bar = &foo(%blubb); durchführen, erst wenn ich sub foo($) schreibe und den hash mit &foo($blubb) übergebe funktioniert es, ich habe irgendwie verständnissprobleme mit dem kontext
als es dann endlich funktionierte habe ich das strict pragma reingeklöppelt und schon meckert er wieder rum warum ich  vor $blubb kein my stehen habe, reicht es nciht wenn vor %blubb ein my steht?\n\n

<!--EDIT|d4mi4n|1132359511-->
betterworld
 2005-11-19 02:35
#60248 #60248
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Lass das lieber mit den Prototypen sein, die sind nicht, was Du willst.

Uebergib Referenzen.
Code: (dl )
1
2
3
4
5
6
7
sub foo {
my ($hashref) = @_;
for (keys %$hashref) {
...
}
}
foo (\%hash);

Mehr dazu in perlref, perlreftut etc
renee
 2005-11-19 03:04
#60249 #60249
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wiki:perlreftut gibt es auch in Deutsch...
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/
d4mi4n
 2005-11-19 06:28
#60250 #60250
User since
2004-07-28
4 Artikel
BenutzerIn
[default_avatar]
gut, dann danke mal, werds nachher mal testen
Dubu
 2005-11-19 14:27
#60251 #60251
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Erstmal vorweg: Ich stimme betterworld zu, Prototypen sollte man nur dann benutzen, wenn man auch genau weiss, wie sie funktionieren.

[quote=d4mi4n,19.11.2005, 01:18]ich habe heute versucht eine funktion zu erstellen an die ich einen hash übergebe, schreibe ich beim prototypen der funktion sub foo (%) kann ich kein $bar = &foo(%blubb); durchführen,
[/quote]
1.) Wenn du eine Funktion mit &funktionsname aufrufst, werden automatisch Prototypen ignoriert. Ich lasse das '&' grundsaetzlich weg. Andere (hallo, strat ;-)) benutzen es selektiv.

2.) Ob mit oder ohne '&', der Aufruf sollte genau so funktionieren:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

sub foo(%) {
   my %hash = @_;

   return Dumper \%hash;
}


my %bar = ( eins => 1, zwei => 2 );

my $baz = foo(%bar);
print $baz;
_ _END_ _
$VAR1 = {
         'eins' => 1,
         'zwei' => 2
       };


Quote
erst wenn ich sub foo($) schreibe und den hash mit &foo($blubb) übergebe funktioniert es,

Du uebergibst dort den Skalar $blubb und nicht den Hash %blubb. Das sind zwei ganz verschiedene Variablen ...

Quote
ich habe irgendwie verständnissprobleme mit dem kontext
als es dann endlich funktionierte habe ich das strict pragma reingeklöppelt und schon meckert er wieder rum warum ich  vor $blubb kein my stehen habe, reicht es nciht wenn vor %blubb ein my steht?

... und deshalb hat die Deklaration von %blubb nichts mit $blubb zu tun. Das meckert strict korrekt an.
betterworld
 2005-11-19 16:04
#60252 #60252
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=Dubu,19.11.2005, 13:27]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

sub foo(%) {
my %hash = @_;

return Dumper \%hash;
}


my %bar = ( eins => 1, zwei => 2 );

my $baz = foo(%bar);
print $baz;
_ _END_ _
$VAR1 = {
'eins' => 1,
'zwei' => 2
};
[/quote]
Wobei man ja sagen muss, dass der Prototyp hierbei gar nicht notwendig ist. Man könnte es auch ohne schreiben:
Code: (dl )
1
2
3
4
5
sub foo{
my %hash = @_;

return Dumper \%hash;
}

Nur ist das alles nicht so gut wie Referenz-Uebergabe, weil es nicht so effizient ist. Denn die Daten des Hashes werden kopiert und durch die Gegend geschaufelt.
Dubu
 2005-11-19 19:56
#60253 #60253
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Hast recht, betterworld, das haette ich dazu sagen sollen.
<< >> 7 Einträge, 1 Seite



View all threads created 2005-11-19 02:18.