人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: peppon
●カテゴリ:ウェブ制作
✍キーワード:CGI name Perl pm モジュール
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● colorchips
●0ポイント

http://www.zend.co.jp/products/studio/ZendInformationCenter/php_...

<input name=”hoge[]”>

<input name=”hoge[]”>

<input name=”hoge[]”>

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


2 ● andi
●20ポイント

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

◎質問者からの返答

ありがとうございます。

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


3 ● andi
●20ポイント

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


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


4 ●
●40ポイント

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

}

}

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ