プロが教える店舗&オフィスのセキュリティ対策術

フォームから値を配列に渡すときの処理方法

PERLでフォームからのデータの受け取り方、処理の仕方でご教授頂ければ助かります。
よろしくお願いいたします。

配列の要素数の調べ方、処理方法についてご教授頂ければ幸いです。


HTMLよりフォームのデータをcgi-lib.plの[&ReadParse(*in);]受け取っているのですが

●HTML側

セレクトボックスを5つ用意し同じNAME (select01)のnameを付けて
CGI側で受け取りたいと考えております。
(基本的に間違えでしょうか?セレクトボックスの個数分用意したほうがいいでしょうか?)



受け取った値をCGI側で受け取り要素の個数をカウントさせ
条件に合わせてERRORを出したいと考えたのですが・・・

エラーの内容は 1っこ選んであればOKでそれ以外 0の場合はNG 2個以上選択した場合は
NGという形を取りたいのですが。

配列の要素数で分岐できるのかと考えたのですが
そもそもこの考え、処理方法は間違えでしょうか?
アドバイスを頂ければ幸いですm(__)m



require 'cgi-lib.pl';

&ReadParse(*in);

-------------------------

# データ代入
@aaa =$in{'select01'}; #フォームデータを配列に代入

$count= @aaa;

この場合だと 要素の数($count)は 1になっております。
いろいろ調べていますと cgi-lib.pl を使用した場合はブラウザ上で
スペースに見えるが \0 だそうで・・・・

カンマで区切って 要素数を正しく表示させたいと思ったのですがうまくいきません。。

@aaa = split(/\0/,$in{'select01'}); などいろいろ試してみたのですが区切りがうまくいきません

また、


$" = ',';
@aaa = split(/\0/,$in{'select01'});

とすると カウントが変わったのですが・・・・

フォーム側の一番目を選択して送信するとカウントが 1!! 

1と5番目を選択して送信したら 5!え??
で要素数を正しくカウントされていないようです。

ちなみに print @aaa; としてみると

aaa,,,,eee と空の内容がカウントされてる?ようなかたちになりました。

ここで、行き詰ってしまいまして、もともとの私の安易な考えが間違えなのか?
書き方が間違えなのか。
と思い皆さまのアドバイスを頂ければ幸いです。


・プログラムの考え方的には間違えなのか

・一般的な正しい処理方法はどうなのか

それとも。。。。要素数で分岐することが可能であるのか。


お手数ですがアドバイス頂ければ幸いです。

A 回答 (3件)

> $count= @aaa;


のようにすると、$count には $#aaa が代入されると勘違いしていました。
書かれているように要素数になるのですね。

質問の件は、
@aaa = split(/\0/,$in{'select01'}) で、正しく取り出せています。
ただ、"aaa\0\0bbb\0\0\0" という文字列を split /\0/ すると
("aaa","","bbb") という配列になり、途中にある空文字列は残りますが、行末の空文字列はなくなります。

なので、
@bbb = grep /./, @aaa;
とでもして @aaa から空文字列の要素を取り除いてから要素数を求めればよいです。
    • good
    • 0
この回答へのお礼

t-okura さま。

早速アドバイスいただきありがとうございますm(__)m
お返事が遅くなりすいません。先ほど試して実行してみました。

grepを使うのですね・・・条件, 調査対象とWEBで見たのですが
なぜ grep/./,@ /./ ドットを使うのか無知なもんで勉強してみます。

実行した結果 無事に解決することができました!!!!ほんとにほんとにありがとうございます。

カウント数で分岐もできました。ありがとうございます!

ただ今回の処理はプログラム的に邪道なのでしょうか??配列の要素数をカウントして
処理する。
初心者でよくわからないながら・・・この方法をとったのですが

ほかの方法をもしご存知でしたら今後のためにもアドバイスいただければ幸いです。

よろしくお願いいたします。

お礼日時:2010/06/20 00:46

cgi-lib.pl には、\0 区切りの文字列を分割するためのサブルーチン SplitParam が用意されていると思います。



@aaa = &SplitParam($in{'select01'});
    • good
    • 0
この回答へのお礼

ありがとうございます。

そちらもやってはいたのですが 要素数をカウントできず困っておりました。
他の方がご回答いただいた
@aaa = &SplitParam($in{'select01'}); のあと
@bbb = grep/./,@aaa;

とすると要素数をカウントすることができました。

ありがとうございます。

お礼日時:2010/06/20 00:49

> @aaa =$in{'select01'}; #フォームデータを配列に代入


> $count= @aaa;
> この場合だと 要素の数($count)は 1になっております。

$count が 1 になっているのでしたら、
$aaa[0], $aaa[1] の 2つの要素が存在します。
    • good
    • 0
この回答へのお礼

ありがとうございます。

セレクトボックスで5個選んだ場合も1 何個選んでも1になるのですが。

要素数を正確に数えたいのですが。

一個選んだら 0 2個選んだら1 三個で 2 五個で4と・・

その要素数で分岐をしたいと考えております。

お礼日時:2010/06/19 13:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!