perl CGI.pm等モジュールを利用しないで、複数のcheckbox(nameは同じ)からの値をまとめて配列に入れる方法を教えてください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/08/09 13:57:22
  • 終了:--

回答(4件)

id:colorchips No.1

colorchips回答回数3ベストアンサー獲得回数02005/08/09 14:52:59

<input name=”hoge[]”>

<input name=”hoge[]”>

<input name=”hoge[]”>

とすれば受け取り時に配列になると思います。

id:andi No.2

andi回答回数448ベストアンサー獲得回数02005/08/09 15:01:56

ポイント20pt

複数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;

id:peppon

ありがとうございます。

クラスを使わない単純な?perlソースを教えて頂けないでしょうか。

2005/08/09 16:30:59
id:andi No.3

andi回答回数448ベストアンサー獲得回数02005/08/09 16:53:44

ポイント20pt

クロージャも・・・駄目ですか?


$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等の変数に入れずにそのキーだけ別の変数(配列)に入れるような方法でも良いかもしれませんが。

id:flowermaze No.4

回答回数20ベストアンサー獲得回数12005/08/09 16:58:03

ポイント40pt

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);

}

}

id:peppon

ありがとうございます。参考になりました。

2005/08/09 17:44:53

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません