Keys eines my %hash1 = (hash2=>{foo, 'bar'})

Hallo

nicht viel los hier, oder?

Ich stolpere gerade meine ersten perl-Schritte. Bislang recht lustig. Aber jetzt habe ich ein Problem bei meinem ergeizigen Projekt, dem Sportwagenmanager. Man kann ja hashes in hashes wie folgt definieren:

my %driver = (
 Fred =\> {
 F40 =\> 10,
 Z4 =\> 20
 },
 Joe =\> {
 SLK =\> 5
 # ...
 }
);

Mit

print $driver{Fred}{F40};

kriege ich raus, wie lange Fred diese Woche schon Ferrari gefahren ist. Jetzt wollte ich wissen, mit welchen Autos insgesamt Fred diese Woche schon wieviel gefahren ist.

foreach my $car in (keys %driver{Fred})
{
 print "$car: ".$driver{Fred}{$car}."\n";
}

waere ja naheliegend gewesen, aber so mag er die keys nicht aus dem inneren hash rauskitzeln. Mag mir jemand verraten, wie ich an die rankomme? (Vielleicht mit ein paar erklaerenden Worten oder link.)

Vielen Dank im Voraus,
Gruss vom Frank.

Hallo,

nicht viel los hier, oder?

Nee, perl ist ja gut dokumentiert :wink:

Ich stolpere gerade meine ersten perl-Schritte. Bislang recht
lustig. Aber jetzt habe ich ein Problem bei meinem ergeizigen
Projekt, dem Sportwagenmanager. Man kann ja hashes in hashes
wie folgt definieren:

my %driver = (
Fred => {
F40 => 10,
Z4 => 20
},
Joe => {
SLK => 5

}
);

Perl macht automatischen list-flattening (und hashes sind ja im Grunde auch Listen). AFAIK musst du mit Zeigern arbeiten, s.u.

[snip] Mag mir jemand
verraten, wie ich an die rankomme? (Vielleicht mit ein paar
erklaerenden Worten oder link.)

#!/usr/bin/perl -w
# $driver ist jetzt ein pointer auf ein Hash, 
# das als values wieder hashes speichert
my $driver = {
 Fred =\> {
 F40 =\> 10,
 Z4 =\> 20
 },
 Joe =\> {
 SLK =\> 5
 # ...
 }
};

print STDOUT $driver-\>{Fred}, "\n";

foreach my $car (keys %{$driver-\>{Fred}})
{
 print "$car: ".$driver-\>{Fred}-\>{$car}."\n";
}

HTH,
Moritz

P.S. ich kann dir

perldoc perlreftut

sehr ans Herz legen :wink:

Hallo,

Hi,

nicht viel los hier, oder?

Nee, perl ist ja gut dokumentiert :wink:

Ja, scheint so.

> > my %driver = (  
> > Fred =\> {  
> > F40 =\> 10,  
> > Z4 =\> 20  
> > },  
> > Joe =\> {  
> > SLK =\> 5  
> > # ...  
> > }  
> > );

Perl macht automatischen list-flattening

Aeh…

> #!/usr/bin/perl -w  
> # $driver ist jetzt ein pointer auf ein Hash,  
> # das als values wieder hashes speichert  
> -my $driver = {

+my $driver = (


> Fred =\> {  
> F40 =\> 10,  
> Z4 =\> 20  
> },  
> Joe =\> {  
> SLK =\> 5  
> # ...  
> }  
> -};

+);


> -print STDOUT $driver-\>{Fred}, "\n";  
> -foreach my $car (keys %{$driver-\>{Fred}})

+print STDOUT $driver{Fred}, "\n";
+foreach my $char (keys %{$driver{Fred}})


> {  
> - print "$car: ".$driver-\>{Fred}-\>{$car}."\n";

+print "$car: ".$driver{Fred}{$car}."\n";


> }

HTH,

Tut es. Wenn ich jetzt noch wueszte, was der Unterschied zwischen dem mit ‚->‘ und dem ohne ist. Lasz mich raten:

> perldoc perlreftut

Steht da drin, oder? Guck ich mal rein.

Danke,
Gruss vom Frank.