Thread arrays erzeugen, mit namen aus anderem array (12 answers)
Opened by landogar at 2005-10-26 10:50

Dubu
 2005-10-28 18:34
#59336 #59336
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[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:
Code: (dl )
1
2
3
4
5
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 ...

View full thread arrays erzeugen, mit namen aus anderem array