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

Von: , Frage gestellt am Di, 29. Jun 2004

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.

2 Antworten zu dieser Frage

  1. Antwort von nach einer Stunde 0 hilfreich
    Re: keys eines my %hash1 = (hash2=>{foo, 'bar'}

    Hallo, nicht viel los hier, oder?
    Nee, perl ist ja gut dokumentiert ;) 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 ;)

    • Antwort von nach 6 Stunden 0 hilfreich
      Re^2: keys eines my %hash1 = (hash2=>{foo, 'bar

      Hallo,
      Hi, nicht viel los hier, oder?
      Nee, perl ist ja gut dokumentiert ;)
      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.

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!