Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6415[/thread]

Warum "Can't use string as ARRAY ref"?!?

Leser: 1


<< >> 6 Einträge, 1 Seite
silbersteine
 2004-07-20 03:03
#84619 #84619
User since
2003-08-18
27 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi,

ich krieg hier bald einen Fön! Kann mir jemand erklären, was ich falsch mache? Irgendwas stimmt mit der Definition des Arrays im Hash nicht. Jedenfalls bekomme ich immer die Fehlermeldung "Can't use string ("xyz") as an ARRAY ref", und anstatt von xyz steht dann immer das erste Element des Arrays. Eigentlich sollen einfach nur die Wochentage von $skalars{'days_string'}  in ein Array desselben Hashes gepackt werden. Wie muss es denn richtig heißen? Könnt ihr mir helfen?

Code: (dl )
1
2
3
4
my %skalars;
$skalars{'days_string'} = "Sonntag,Montag,Dienstag,Mittwoch,Donnnerstag,Freitag,Samstag";
@skalars{'days'} = split(/,/,$skalars{'days_string'});
print $skalars{'days'}[3];
Viele Grüße aus Calberlah

Der SilberStein

<a href="http://www.skriptoase.de/">www.skriptoase.de</a>

# "It's all very perlish" (L.Wall)
coax
 2004-07-20 03:26
#84620 #84620
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Dein @skalars{'days'} ist ein Hash-Slice, das mit einen einzigen Hash-Key wenig Sinn macht, da es dem $skalars{'days'} gleich ist.
Ein Hash-Slice wuerdest du verwenden, wenn du mehrere Hash-Keys auf einmal ansprechen moechtest:
Code: (dl )
@hash{'key1', 'key2', 'key3'} = qw(eins zwei drei);

Was du aber moechtest ist, dem $skalare{'days'} eine Referenz auf ein (anonymes) Array zuweise, das als Werte das Ergebnis von split hat. Also...

Code: (dl )
$skalars{'days'} = [split(/,/,$skalars{'days_string'})];
,,Das perlt aber heute wieder...'' -- Dittsche
silbersteine
 2004-07-21 00:15
#84621 #84621
User since
2003-08-18
27 Artikel
BenutzerIn
[Homepage] [default_avatar]
Oh, vielen vielen Dank! Es funktioniert - auch wenn mir noch nicht ganz klar ist, warum ...
Viele Grüße aus Calberlah

Der SilberStein

<a href="http://www.skriptoase.de/">www.skriptoase.de</a>

# "It's all very perlish" (L.Wall)
betterworld
 2004-07-21 00:20
#84622 #84622
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=silbersteine,20.07.2004, 22:15]auch wenn mir noch nicht ganz klar ist, warum ...[/quote]
Das liegt daran, dass Werte in einem Hash immer Skalare sein muessen und keine Arrays oder aehnliches sein duerfen. Was nun aber, wenn man mehrere Elemente in einem Hash-Wert haben will? Dann erzeugt man einfach eine Referenz auf sein Array. Eine Referenz ist naemlich ein Skalar und darf also als Hash-Wert auftauchen. Und genau das ist coax' Ansatz.

hth, sonst frag einfach noch einmal\n\n

<!--EDIT|betterworld|1090354831-->
silbersteine
 2004-07-21 00:32
#84623 #84623
User since
2003-08-18
27 Artikel
BenutzerIn
[Homepage] [default_avatar]
Aha, schon verstanden, danke! Das ganze hat mich nur gewundert, weil ich schon jahrelang mit Arrays und Hashes im Hash arbeite, aber nie einen solchen Fehler hatte. Auch mit Referenzen! Nur habe ich wohl noch nie versucht, ein Array auf diese Art zu deklarieren. sonst habe ich das immer so gemacht:

Code: (dl )
my %config = ("daysofweek" => ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnnerstag", "Freitag", "Samstag"]);


Und so ist mir nie bewusst gewesen, dass hier nur eine Referenz auf das Array angelegt wird. Die Abfrage funktioniert ja auch ganz easy und ohne Hinweis auf eine Referenz:

Code: (dl )
$a = $config{'daysofweek'}[3];
Viele Grüße aus Calberlah

Der SilberStein

<a href="http://www.skriptoase.de/">www.skriptoase.de</a>

# "It's all very perlish" (L.Wall)
betterworld
 2004-07-21 00:34
#84624 #84624
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=silbersteine,20.07.2004, 22:32]Und so ist mir nie bewusst gewesen, dass hier nur eine Referenz auf das Array angelegt wird. Die Abfrage funktioniert ja auch ganz easy und ohne Hinweis auf eine Referenz:

Code: (dl )
$a = $config{'daysofweek'}[3];
[/quote]
In irgend einer Stelle in den Tiefen der perldocs steht, dass mehrere Klammern hintereinander automatisch dereferenziert werden. Der Aufruf ist identisch mit:
Code: (dl )
$a = $config{'daysofweek'}->[3];
<< >> 6 Einträge, 1 Seite



View all threads created 2004-07-20 03:03.