Schrift
[thread]8930[/thread]

Hash in Sub dereferenzieren

Leser: 2


<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Opaxtl
 2007-04-19 16:24
#76038 #76038
User since
2007-03-21
12 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich übergebe einer Sub eine Referenz auf einen Hash, also so:

Code: (dl )
foo(\%hash);


In der Sub möchte ich aber nicht mit der Referenz arbeiten, weil ich die Werte im Hash verändere, wovon das Hauptprogramm nichts mitkriegen darf.

Code: (dl )
1
2
3
sub foo {
my %hash = %{shift};
}


funktioniert aber nicht, der Hash ist leer. Wie gehts dann?

Vielen Dank für eure Hilfe!

Patrick
Gast Gast
 2007-04-19 16:37
#76039 #76039
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
sub foo {
   my $href = shift;
   # Arbeit  mit Referenz Hash
   foreach my $key (keys %$href) {
       my $value = $href->{$key};
       print "$key => $value\n";
   }
}

my %hash = ('a'=>1, b=>2);
foo(\%hash)


edit pq: code-tags hinzugefügt\n\n

<!--EDIT|pq|1177008300-->
Ronnie
 2007-04-19 16:38
#76040 #76040
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Wenn du use warnings; verwendest, sagt dir perl wieso!
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my %hash = ( foo => 42, bar => '0815', buz => 'Woodstock' );

sub foo {
my %hash = %{shift @_}; # use warnings!
warn Dumper \%hash;
}

foo(\%hash);
\n\n

<!--EDIT|Ronnie|1176986545-->
docsnyder
 2007-04-19 16:59
#76041 #76041
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@Opaxtl

Wenn Du den Hash in Deiner sub veränderst, das aber außerhalb der sub nicht sichtbar sein soll, mußt Du den Hash entweder in der sub duplizieren und dann das Duplikat verändern, oder Du übergibst den Hash direkt als Parameter an die sub (nicht als Referenz). Im letzteren Fall wird der Hash dann auch kopiert.

Gruß, Doc
Opaxtl
 2007-04-19 16:59
#76042 #76042
User since
2007-03-21
12 Artikel
BenutzerIn
[default_avatar]
Danke schonmal, nur bekomme ich die Fehlermeldung

Missing comma after first argument to warn function

in der warn-Zeile.

Vielleicht sollte ich noch erwähnen, dass das Teil eines CGI-Scripts ist, ich bräuchte die Fehlermeldung also auf STDOUT.
renee
 2007-04-19 17:02
#76043 #76043
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Muss
Code: (dl )
warn Dumper(\%hash);
heißen...
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/
Opaxtl
 2007-04-19 17:04
#76044 #76044
User since
2007-03-21
12 Artikel
BenutzerIn
[default_avatar]
Ich dachte, einen Hash kann man nur als Referenz übergeben.

Code: (dl )
1
2
3
4
5
6
7
8
9
sub foo {
my %hash = shift;
print $hash{hallo};
}

my %hash;
$hash{hallo} = "welt";

foo(%hash);


funktioniert auf jeden Fall auch nicht, der Hash ist leer.
docsnyder
 2007-04-19 17:10
#76045 #76045
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@Opaxtl

Quote
Ich dachte, einen Hash kann man nur als Referenz übergeben.

Nööö!

Ersetze mal
Code: (dl )
my %hash = shift;

durch
Code: (dl )
my %hash = @_;

Shift holt Dir ja nur den ersten Parameter.

Gruß, Doc
renee
 2007-04-19 17:12
#76046 #76046
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Entweder
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
sub foo {
 my %hash = @_;
 print $hash{hallo};
}

my %hash;
$hash{hallo} = "welt";

foo(%hash);
oder
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
sub foo {
 my %hash = %{shift @_};
 print $hash{hallo};
}

my %hash;
$hash{hallo} = "welt";

foo(\%hash);


Auf jeden Fall solltest Du Wiki:[tt]use strict[/tt] verwenden.
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/
Ronnie
 2007-04-19 17:27
#76047 #76047
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=renee,19.04.2007, 15:02]Muss
Code: (dl )
warn Dumper(\%hash);
heißen...[/quote]
merkwürdig, bei mir geht es ohne Klammer problemlos mit perl v5.8.6
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2007-04-19 16:24.