Dein
$form ist nicht einfach eine Hashreferenz, sondern eine Referenz auf einen mit
tie() an das CGI-Objekt
gebundenen Hash.
Wenn du Elementen aus
$form etwas zuweist, rufst du damit also die STORE-Methode in CGI.pm fuer diesen Hash auf, und die sieht so aus:
sub STORE {
my $self = shift;
my $tag = shift;
my $vals = shift;
my @vals = index($vals,"\0")!=-1 ? split("\0",$vals) : $vals;
$self->param(-name=>$tag,-value=>\@vals);
}
In
$self steht die Klasse (hier CGI), in
$tag der Key (bei dir
'list_of_selections') und in
$vals der zuzuweisende Wert. Wie man gut sehen kann, wird dabei
$vals immer als Skalar interpretiert, evtl. auch als String mit eingebetteten Nullbytes fuer Mehrfachauswahlen. Somit landet statt deiner Arrayreferenz deren stringifizierte Darstellung (
'ARRAY(0x81642e0)') im Hash.
Die Vorgehensweise ist in diesem Zusammenhang auch sinnvoll, denn so kann CGI.pm die Formulardaten weiter verwenden, z.B. um sie zu speichern oder als Default fuer das wieder aufgerufenen Formular zu nehmen.
Wenn du wirklich eine Kopie des Hashes haben moechtest, die du beliebig veraendern kannst, dann musst du sie anlegen, z.B. direkt beim Aufruf von
Vars():
my %form = $cgi->Vars();
# oder als Referenz
my $form = { $cgi->Vars() };
PS: Ich wusste das mit dem tied hash bis eben auch nicht, aber nachdem ich dein Beispiel nachvollzogen hatte und es mir auch merkwuerdig vor kam, half ein Blick in die Definitionen von [tt]Vars() und [font=courier]STORE()[/tt] in CGI.pm.[/font]
Edit: pKai war schneller. 8)\n\n
<!--EDIT|Dubu|1116964853-->