Thread CGI.pm und Arrays von Parametern (4 answers)
Opened by Ronnie at 2005-05-24 21:19

Dubu
 2005-05-24 23:59
#4966 #4966
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

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

View full thread CGI.pm und Arrays von Parametern