Schrift
[thread]9033[/thread]

Hash mit Schlüssel und Wert (--> ArrayReferenz): hash



<< >> 8 Einträge, 1 Seite
Duff
 2007-05-24 23:47
#76905 #76905
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Hallo,

komme mal wieder nicht weiter.

Habe einen Hash, in dem die Schlüssel auf eine ArrayReferenz zeigen.

Nun möchte ich gerne den Hash auslesen und auch den Wert (ArrayReferenz) der Schlüssel.

So sieht es aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl -w

use strict;

my @array1=qw(wert1 wert2);
my @array2=qw(wert1 wert2);

my $arrayref1=\@array1;
my $arrayref2=\@array2;

my %hash=("schluessel1" => "$arrayref1",
"schluessel2" => "$arrayref2"
);

foreach my $key (keys %hash) {
print "$key: \t $hash{$key}\n";
}


So bekomme ich zwar den Schlüssel, aber zum Schlüssel nur die ArrayRefernz und nicht den Inhalt der ArrayReferenz.

Bekomme es nicht hin!
D'OH
Daniel
Linuxer
 2007-05-25 00:03
#76906 #76906
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Hi,

du musst dereferenzieren, z.B. so:

Code: (dl )
1
2
3
4
5
foreach my $key ( keys %hash ) {
my @array = @{ $hash{$key} };

print "$key : @array ", $/;
}


Oder Du verwendest das @{ $array_ref } direkt im print; das ginge auch.

Code: (dl )
1
2
3
4
5
foreach my $key ( keys %hash ) {
print "$key : @{ $hash{$key} }", $/;
# or edit first element of each array_ref
$hash{$key}->[0] = "Hallo Welt!";
}


Je nach Code-Umfang ist es aber durchaus praktischer und übersichtlicher, erst einen eigenen Array mit den Daten der dereferenzierten ArrayReferenz zu füllen.

Achtung: Wenn Du die Daten im Hash-of-Arrays bearbeiten willst, bekommst Du bei der Array-Variante Probleme, weil im Array nur eine Kopie der eigentlichen Daten liegt!
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Linuxer
 2007-05-25 00:14
#76907 #76907
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
passende Doku:

http://perldoc.perl.org/perldsc.html
http://perldoc.perl.org/perlref.html
http://perldoc.perl.org/perldata.html
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
topeg
 2007-05-25 08:28
#76908 #76908
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
ganz kurz:
So geht das nicht:
Code: (dl )
"schluessel1" => "$arrayref1"

das mußt du so machen:
Code: (dl )
"schluessel1" => $arrayref1

Deine Variante wandelt die Referenz in einen String um.

Der Zugriff auf die Referenz erfolgt so:
Code (perl): (dl )
1
2
3
4
5
$hash{schluessel1}->[0]; # erstes Element aus erstem Array
# oder
$$hash{schluessel1}[0]; # wie oben.
# oder du dereffenzierst
@array1_neu=@{$hash{schluessel1}}; # dabei ist das Array @array1_neu unabhängig von der Refferenz
Linuxer
 2007-05-25 10:56
#76909 #76909
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image

EDIT: Fehler meinerseits. Der Code unten funktioniert selbstverständlich, da ich die Referenz nicht in einen String umwandle. Danke an PerlProfi für den Hinweis!
Dieses Beispiel bitte ignorieren!


Naja, es funktioniert immerhin ;o):

Code: (dl )
1
2
3
4
5
6
7
8
$ perl -w -Mstrict
my $aa = "Hallo Welt";
my $ref = \$aa;

print $$ref, $/;

^D
Hallo Welt


OK, sauber ist das nicht (und ich hab es im OP schlicht überlesen) und ich würde es auch ohne "" tun.\n\n

<!--EDIT|Linuxer|1180089362-->
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
PerlProfi
 2007-05-25 14:23
#76910 #76910
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
In deinem Beispiel wird ja auch nirgends eine Referenz in einen String umgewandelt.
Folgendes gibt einen Fehler:
Code: (dl )
1
2
3
4
5
my $str = 'Hallo Welt';
my $ref = \$str;
my $strref = "$ref";

print $$strref;

Genauso wie dieses:
Code: (dl )
1
2
3
4
5
my %hash;
my $arrref = ['Hallo', 'Welt'];
$hash{ArrRef} = "$arrref";

print "@{ $hash{ArrRef} }";


MfG
Linuxer
 2007-05-25 14:33
#76911 #76911
User since
2006-01-27
3875 Artikel
HausmeisterIn

user image
Verdammt.
Asche auf mein Haupt... hast natürlich recht...

Ich streiche meine Aussage!
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Duff
 2007-05-25 16:03
#76912 #76912
User since
2006-10-06
283 Artikel
BenutzerIn

user image
Danke für die Antworten und Erklärungen.

Da lag wohl auch mein Fehler, dass ich die $arrayref's in "" gepackt hatte.

Nun kann ich die Ausgabe auch so machen, wie ich gedacht hatte:
Code: (dl )
1
2
3
foreach my $key (keys %hash) {
print "$key: \t @{$hash{$key}}\n";
}
D'OH
Daniel
<< >> 8 Einträge, 1 Seite



View all threads created 2007-05-24 23:47.