Hallo,
Das ist ein Trugschluss. Die zweite Variante funktioniert, weil der ->-Operator automatisch eine anonyme Hash-Referenz anlegt. Aber probiere es ruhig aus:
ok
perl -MData::Dumper -Mstrict -e 'my $c1; my $c2 = {}; print Dumper $c1; print Dumper $c2;'
syntax error at ./hash.pl line 14, near "Mstrict -e "
Execution of ./hash.pl aborted due to compilation errors.
und warum funktioniert
print "$c1{Begruessung}\n";
nicht?
Weil sich das auf den Hash %c1 bezieht, der zwar in diesem Fall indirekt angelegt wird, aber der keinen Key "Begruessung" hat.
damit ich das richtig verstehe... %c1; ist ein gewöhnlicher hash und $c1={}; ist eine referenz auf eine anonyme hash tabelle?
was wäre dann für die folgende Struktur geeigneter?
Dateiinhalt:
begr=hallo
name=anonymous
while(<DATEI>) {
($a,$b)=split /=/,$_;
$hs->{$a}=$b; # diese Variante
$hs{$a}=$b; # oder diese
}
my $c3 = ();
Undefinierter Wert (du expandierst durch diese Zuweisung eine leere Liste zu einem String, das gibt undef).
aber dies ist doch auch wieder das Gleiche wie
$c3;Das gleiche schon, aber nicht dasselbe.
denn der Skalar ist zunächst undefiniert. Warum setzt man dann $c3=(); ?
Tut man nicht, höchstens um Leute absichtlich zu verwirren.