Christian Kruse: Hash of List - Syntax für Zugriff gesucht

Beitrag lesen

你好 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;  

再见,
 克里斯蒂安