※ ChatGPTを利用し、要約された質問です(原文:チェックボックスで得た複数回答をCGIモジュールを用いて簡潔に取り出すには)
チェックボックスで得た複数回答をCGIモジュールを用いて簡潔に取り出すには
このQ&Aのポイント
チェックボックスの複数回答をCGIモジュールを使ってスムーズに取得する方法について悩んでいます。
CGIモジュールを使用してキーと値を取得し、配列に格納する処理が必要ですが、実際には最初の値しか取得できません。
一つの解決策として、チェックボックスのname属性を連番にして値を取得し、それを統合する方法が考えられます。しかし、もっと効率的な方法があるのか気になっています。
チェックボックスで得た複数回答をCGIモジュールを用いて簡潔に取り出すには
<input type="checkbox" name="id" value="0">
<input type="checkbox" name="id" value="1">
<input type="checkbox" name="id" value="2">
<input type="checkbox" name="id" value="3">
のようなフォームのキーと値を、CGIの方では%inで受け取ります。
まずCGIモジュールを用いてキーと値を$keyと$valに格納したのち、idというキーは4つの値を受け取るので、
foreach my $key ($q->param()) {
my $val=$q->param($val);
if(defined($in{$key)) {
$in{$key}.="\0";
}
$in{$key}.=$val;
}
私のイメージでは、この処理で
$in{'id'}="0\01\02\03";
が得られるつもりでした。
ところが実際には$q->param('id')で取り出せるのは最初の"0"のみで、したがって得られる結果は
$in{'id'}="0";
となります。
CGIモジュールを使わなければ、
my $buf;
if(ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN,$buf,$ENV{'CONTENT-LENGTH'});
}
else {
$buf=$ENV{'QUERY_STRING'};
}
foreach(split(/&/,$buf)) {
my ($key,$val)=split(/=/);
if(defined($in{$key)) {
$in{$key}.="\0";
}
$in{$key}.=$val;
}
のようにして、イメージ通り
$in{'id'}="0\01\02\03";
を得られますが、CGIモジュールは他でも使うので、どうせならCGIモジュールを使った簡便なコーディングが出来ないものかと思案する次第です。
しかしながら私に思いつく方法は
<input type="checkbox" name="id0" value="0">
<input type="checkbox" name="id1" value="1">
<input type="checkbox" name="id2" value="2">
<input type="checkbox" name="id3" value="3">
として、まずCGIモジュールを用いた上記の方法で$in{'id0'}~$in{'id3'}までを生成し、次に
if(/(\w+)\d/) {
if(defined($in{$1})) {
$in{$1}.="\0";
}
$in{$1}.=$val;
}
とやる方法しか思いつきません。
チェックボックスを用いて複数回答を得るというのはよくある話なので、CGIモジュールにもっと良いコーディングの仕方がありそうな・・・と思ってしまうのですが、これが最善の方法なのでしょうか?
お礼
ありがとうございます。 うまく複数回答を受け取ることが出来ました。