[quote=landogar,28.10.2005, 14:26]ich hab jetzt ein zweidimensionales hash{1.dim}{2.dim}
ich befülle dieses jetzt mit werten:
vereinfacht:
hash{1.dim}{2.dim1}="wert";
hash{1.dim}{2.dim2}="wert";
hash{1.dim}{2.dim3}="wert";
hash{1.dim}{2.dim4}="wert";
wenn ich jetzt einen wert in der 1.dimension hinzufügen will
hash{1.dim}="wert";
kommt mit use strict folgende fehlermeldung:
Can't use string ("1") as a HASH ref while "strict refs" in use at...
warum kann ich in der ersten ebene keinen wert mehr hinzufügen??[/quote]
Ich nehme mal an, dass du versuchst, einen Wert in der
zweiten Ebene hinzuzufuegen, nachdem du einen Wert in der
ersten Ebene skalar gesetzt hast.
Also sowas:
use strict;
use warnings;
my %hash;
$hash{foo} = 42;
$hash{foo}{bar} = 23;
Die letzte Zeile gibt einen Fehler "Can't use string ("42") as a HASH ref while "strict refs" in use ...". Warum? Weil ein
$hash{foo}{bar} verlangt, dass
$hash{foo} eine Hashreferenz ist!
$hash{foo} kann aber nur eines von beidem sein: entweder ein Skalar (
42) oder eine Hashreferenz (
{ bar => 23 }).
Wenn man aber selber schon
$hash{foo} mit 42 gefuellt hat, dann versucht Perl so etwas wie
42->{bar} = 23 zu interpretieren, und das geht schief.
Wenn man die letzte Zeile vor der vorletzten ausfuehrt, gibt es keine Fehlermeldung, weil Perl so schlau ist, automatisch in
$hash{foo} eine Referenz auf
{ bar => 23 } anzulegen (Das nennt sich "autovivification").
Anschliessend wuerde durch das
$hash{foo} = 42; diese Referenz einfach wieder geloescht und das
{ bar => 23 } verloren gehen.
Merke: Ein Hash kann fuer einen Schluessel immer nur einen Wert haben -
entweder einen Skalar
oder eine Referenz.*
PS: Dein Beispiel mit diesem "1.dim" war uebrigens ein schlechtes, weil "1.dim" kein gueltiges Bareword ist und damit als Schluessel in einem Hash in Anfuehrungszeichen stehen muesste.
* Ja, okay, oder ein Filehandle, einen Typeglob, ein Format ...