Hash of List - Syntax für Zugriff gesucht
Robert
- perl
0 Robert0 Siechfred0 Christian Kruse0 Robert
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
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
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
你好 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} = [];
}
再见,
克里斯蒂安
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
»» ~~~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/)
你好 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;
再见,
克里斯蒂安