<input name=”hoge[]”>
<input name=”hoge[]”>
<input name=”hoge[]”>
とすれば受け取り時に配列になると思います。
複数checkboxと単一のデータが混在するならクラスを作って管理すれば便利な気がしますね。
# パラメータ管理クラス
$p = param->new;
# フォームの入力値と思って下さい
$q_string = ”a=1&a=2&b=3”;
# 入力値を分割してクラスにセット
grep{ $p->set(split(/=/)) } split(/&/,$q_string);
# クラスから値を取得。checkboxの値は配列で返す
print join(”,”,$p->get(’a’));
package param;
use strict;
sub new{
bless {},shift;
}
sub set{
my($self,$key,$value) = @_;
push(@{$self->{$key}},$value);
}
sub get{
my($self,$key) = @_;
return wantarray ? @{$self->{$key}} : ${$self->{$key}}[0];
}
1;
クロージャも・・・駄目ですか?
$p = param();
$q_string = ”a=1;a=2;b=3”;
grep{ &$p(split(/=/)) } split(/;/,$q_string);
print join(’,’,&$p(’a’));
sub param{
my %param;
return sub{
my($key,$value) = @_;
if($key && $value){
push(@{$param{$key}},$value);
}
return wantarray ? @{$param{$key}} : ${$param{$key}}[0];
}
};
あるいは%param等の変数に入れずにそのキーだけ別の変数(配列)に入れるような方法でも良いかもしれませんが。
http://www.futomi.com/lecture/form/cgilib.html
Perlで作るCGI講座 - cgi-lib.pl を使ってみよう - futomi's CGI Cafe
cgi-lib.plの使用も不可ですか? 可であれば参考URLを見てください。
下記のソースはライブラリやモジュールを使いたくない場合に、私が書いているソースの例です。
@inputにnameの順番を、%inputに実際の値を格納しています。
同じnameのものは<>を区切り文字にして同じキーに追加し、必要な際に
@hoge = split(”¥t”, %input{’hoge’})
のようにして配列に格納します。
------------------------------
my $buffer;
# $bufferに送信データを取得
if ($ENV{’REQUEST_METHOD’} eq ”POST”) {
read (STDIN, $buffer, $ENV{’CONTENT_LENGTH’});
} else {
$buffer = $ENV{’QUERY_STRING’};
}
my @query = split(/&/, $buffer);
foreach (@query) {
my $name;
my $value;
($name, $value) = split(/=/);
# デコード
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(”C”, hex($1))/eg;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack(”C”, hex($1))/eg;
if ($value eq ””) {
unless ($input{$name}) {
$value = ’(未記入)’;
}
}
if ($input{$name}) {
if ($input{$name} eq ’(未記入)’) {
$input{$name} = $value;
} else {
$input{$name} = $input{$name} . ”<>” . $value;
}
} else {
$input{$name} = $value;
push (@input, $name);
}
}
ありがとうございます。参考になりました。
ありがとうございます。
クラスを使わない単純な?perlソースを教えて頂けないでしょうか。