Robert: Hash of List - Syntax für Zugriff gesucht

Hallöle,

was ich will, ist ein Hash (soweit noch kein Problem) von Listen.
Wenn ich einen neuen Key-Wert habe, gelingt es mir auch, eine leere Liste einzuhängen.

if (! exists $hashTP{$currTP})
{
    $hashTP{$currTP} = ();
}

Was mir nicht gelingt, ist, einen Wert in diese Liste zu pushen.
Mein Versuch ist:

push $hashTP{$currTP}, $_;

was mir mit
Type of arg 1 to push must be array (not hash element) at test.pl line 94
beantwortet wird.
Wie teile ich dem Perl-Interpreter mit, daß $hashTP{$currTP} eine Liste ist?

Irgendwann später will ich die Listen dann ausgeben (Reihenfolge der Listen egal), ich probier das mit

foreach (keys %hashTP)
{
    $key = $_;
    foreach ($hashTP{$key})
    {
        print $_;
    }
}

Ist das denn korrekt?

TIA,
Robert

  1. push $hashTP{$currTP}, $_;

    wie ich inzwischen rausgefunden habe, muß es

    push @{ $hashTP{$currTP} }, $_;

    heißen.
    Und für die Ausgabe

    foreach (keys %hashTP)
    {
        $key = $_;

    foreach (@{ $hashTP{$key} })

    {
            print $_;
        }
    }

    cu,
    Robert

    1. Tag Robert.

      wie ich inzwischen rausgefunden habe, muß es
      push @{ $hashTP{$currTP} }, $_;
      heißen.

      Gut, dass ich vor dem Absenden noch mal nach Antworten geschaut habe, so bleibt mir nur noch der Hinweis auf perldsc :-)

      Siechfred

    2. 你好 Robert,

      wie ich inzwischen rausgefunden habe, muß es

      push @{ $hashTP{$currTP} }, $_;

      Nicht nur das. Deine Initialisierung ist auch fehlerhaft:

        
      if(!exists $hashTP{$currTP}) {  
        $hashTP{$currTP} = [];  
      }  
      
      

      再见,
       克里斯蒂安

      --
      Buchpreisbindung? | Plasma-Bildschirm geklaut
      Der Geist ist alles. Du wirst, was du denkst.
      http://wwwtech.de/
      1. Hallöle,

        »» ~~~perl

        »» if(!exists $hashTP{$currTP}) {
        »»   $hashTP{$currTP} = [];
        »» }
        »»

          
        Hm. Mit () statt [] bekomme ich auch bei use strict und use warnings keinerlei Hinweis darauf, daß da was falsch sein könnte.  
          
        Aber wenn wir schon beim Thema sind:  
          
        Wie bekomme ich denn einen leeren Hash in meinen Hash?  
          
        $hash{$key} = {};  
          
        Oder anders?  
          
        TIA,  
        Robert  
          
          
        
        
        1. »» ~~~perl

          »» if(!exists $hashTP{$currTP}) {
          »»   $hashTP{$currTP} = [];
          »» }
          »»

          
          >   
          > Hm. Mit () statt [] bekomme ich auch bei use strict und use warnings keinerlei Hinweis darauf, daß da was falsch sein könnte.  
            
          nicht falsch, aber mit () erzeugst du eine Liste, da du aber auf der linken Seite einen scalar hast wird diesem nur die Länge zugewiesen (ohne jetzt zu testen entweder null oder undef)  
          während du aber eine Referenz auf eine Liste willst, dass erreichst du mit einer eckigen Klammer.  
            
          Mit einer runden Klammer sollte dein Skript abbrechen, wenn du versucht mit pop oder push darauf zu zugreifen.  
            
          
          > Wie bekomme ich denn einen leeren Hash in meinen Hash?  
          >   
          > $hash{$key} = {};  
            
          Ja, damit erzeugst du eine Referenz auf einen leeren Hash.  
            
            
          Struppi.
          
          -- 
          [Javascript ist toll](http://javascript.jstruebig.de/)
          
          1. 你好 Struppi,

            if(!exists $hashTP{$currTP}) {
              $hashTP{$currTP} = [];
            }

            
            > >   
            > > Hm. Mit () statt [] bekomme ich auch bei use strict und use warnings  
            > > keinerlei Hinweis darauf, daß da was falsch sein könnte.  
              
            Das heisst nicht, dass es nicht falsch ist ;) Sieh es dir doch mal an:  
              
            ~~~perl
              
            use strict;  
            use warnings;  
            use Data::Dumper;  
              
            my $var = {};  
              
            $var->{brackets} = ();  
            $var->{squarebrackets} = [];  
              
            print Dumper $var;  
            
            

            Du siehst, der Hash hat einen Eintrag mit dem Key „brackets“ dessen
            Inhalt „undef“ ist und einen Eintrag mit dem Key „squarebrackets“,
            dessen Inhalt [] ist, was eine Array-Referenz erzeugt – der Inhalt ist
            also eine Array-Referenz. Das, was du eigentlich wolltest ;)

            nicht falsch, […]

            Doch, in diesem Falle falsch weil nicht das, was gewünscht.

            […] (ohne jetzt zu testen entweder null oder undef)

            Undef ;)

            Mit einer runden Klammer sollte dein Skript abbrechen, wenn du versucht
            mit pop oder push darauf zu zugreifen.

            Nein, da greift das automagische Type-Mangeling. Wenn du eine Variable mit
            dem Wert „undef“ dereferenzierst, wird implizit eine neue Referenz
            erstellt:

              
            use strict;  
            use warnings;  
            use Data::Dumper;  
              
            my $var = {};  
              
            $var->{brackets} = ();  
            push @{$var->{brackets}},"abcdef";  
              
              
            print Dumper $var;  
            
            

            再见,
             克里斯蒂安