フォーム上でアンケートを集計するプログラムを書いています。
年代、性別、回答という項目があり、各回答につき、年代と性別別の表を出力するものです。
IF文でやれば出来るのですが、プログラムを極力短くするために、フォームの回答から一定の変数を書き出して計算させる方法を考えています。

例えば30代の男で1番に回答があった時には、データは"age=30&sex=man&ans=1"という具合で渡されてくるので、これを並べて変数名として扱い、変数"$30man1"に1をプラスするというようなことを行いたいのですが、試行錯誤してもうまくいきませんでした。
文字列を並べた値を変数名として認識させるところがダメなようです。

可能であれば、方法をご存じの方、お教えいただければ幸いです。

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

文字列を変数名として使うには、シンボリックリファレンスと言う機能を使います。


  ${"文字列"}
とすれば、この「文字列」を変数名として
  ${"文字列"} = 10;
のように使うことができます。

ところが
  ${"30man1"}
は、変数名が数字で始まることになってしまうので、必ず文字になる値を先頭に持ってくるか、ダミーで1文字入れるかしないとだめです。

ところで、これはPerlの話でよいのでしょうか?
CGIを作っているのだとしても、言語の問題で質問するなら、そちらのカテゴリで質問すべきですよ?
    • good
    • 0

連想配列でいきましょう。

    • good
    • 0

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

このQ&Aと関連する良く見られている質問

QCGIのPerlの変数をJavaScriptの変数に使えますか

CGIのPerlの変数をJavaScriptの変数に使えますか
使い方お願いします。

Aベストアンサー

もうちょっと具体的にどうしたいのか教えてください。

PerlにJavaScrptを書き出させればPerl側で使っている変数の値(あくまで値)をJavaScriptに渡すことはできますけど。

Qフォームに入力した情報をそのフォームに反映するには?

http://f29.aaa.livedoor.jp/~unyu/joban/unyu.cgi?line=oer1000
上記のサイトのように、情報をフォームに入力し投稿ボタンを押すと入力したフォームに反映/保存され、その情報を他の人も変更(投稿)/回覧できるようにするにはどのようにすればよいのでしょうか?
CGI/perlなどを探し、掲示板のプログラムを改造したりしましたが分かりません。回答お願いします。

Aベストアンサー

こんなのはどうでしょうか。
我流プログラマなので、おかしかったら読み飛ばして下さい。

考え方はhtmlをcgiでデータ部分を書き換えて書き出す方法です。
test.htmlの、$~$で囲まれた部分を、cgiが書き換えます。
selectedの部分は、あるデータがある値のとき、$selected_データ名=値$ を'selected'に書き換えます。
checkedの部分は、$checked_データ名=値$ を'checked'に書き換えます。
ファイルの読み書きで、改行を\nにしてます。
言葉で説明するのが難しいので、プログラムを見てください。

下のtest.htmlと、test.cgiと、空のtest.datを用意してください。
test.cgiは、パーミッションを705(か755)にしてください。
#!/usr/bin/perlの部分は適当に書き換えてください。
test.datは、パーミッションを606(か666)にしてください。
perl5.8の標準モジュールCGIを使ってます。
perl5.6とかなら、cgi.pmをインクルードしてください。

--- test.html ここから ---
<form action="./test.cgi" method="post">
data1:<input type="text" name="data1" value="$data1$"><br>
data2:<input type="text" name="data2" value="$data2$"><br>
data3:<textarea name="data3">$data3$</textarea><br>
data4:<select name="data4">
<option value="" $selected_data4=$>選んでね
<option value="1" $selected_data4=1$>その1
<option value="2" $selected_data4=2$>その2
</select><br>
data5:<input type="checkbox" name="data5" value="1" $checked_data5=1$><br>
data6:
<input type="radio" name="data6" value="1" $checked_data6=1$>aaa
<input type="radio" name="data6" value="2" $checked_data6=2$>bbb<br>
<input type="submit" name="regist" value="登録">
</form></form>
--- test.html ここまで ---

--- test.cgi ここから ---
#!/usr/bin/perl

use strict;
use CGI::Carp qw(fatalsToBrowser);
use CGI;

my $query = new CGI;
print $query->header(-charset=>'Shift_JIS');

my %data;

if(defined $query->param('regist')){
#データの登録
$data{data1}=$query->param('data1');
$data{data2}=$query->param('data2');
$data{data3}=$query->param('data3');
$data{data4}=$query->param('data4');
$data{data5}=$query->param('data5');
$data{data6}=$query->param('data6');
#改行変更
foreach my $key(keys %data){$data{$key}=~s/\n/\\n/g}
#データ書き出し
open(OUT,'>./test.dat');
print OUT join("\n",%data)."\n";
close(OUT);
}

#フォーム読込み
open(IN,'./test.html');
my $form=join("\n",<IN>);
close(IN);

#データ読み込み
open(IN,'./test.dat');
%data=grep(chomp,<IN>);
close(IN);

#改行変更
foreach my $key(keys %data){$data{$key}=~s/\\n/\n/g}

#selectedデータ作成(select)
$data{'selected_data4='.$data{data4}}='selected';

#checkedデータ作成(checkboxとradio)
$data{'checked_data5='.$data{data5}}='checked';
$data{'checked_data6='.$data{data6}}='checked';

#フォームへデータ書き込み
$form=~s/\$(.+?)\$/$data{$1}/g;

#フォーム表示
print $form;
exit;
--- test.cgi ここまで ---

こんなのはどうでしょうか。
我流プログラマなので、おかしかったら読み飛ばして下さい。

考え方はhtmlをcgiでデータ部分を書き換えて書き出す方法です。
test.htmlの、$~$で囲まれた部分を、cgiが書き換えます。
selectedの部分は、あるデータがある値のとき、$selected_データ名=値$ を'selected'に書き換えます。
checkedの部分は、$checked_データ名=値$ を'checked'に書き換えます。
ファイルの読み書きで、改行を\nにしてます。
言葉で説明するのが難しいので、プログラムを見てください。

下...続きを読む

Q[返信]

夜分にすみません。
[~]の鍵括弧はどういう言語なのでしょうか?
htmlの辞書に載っていませんでした・・。

Aベストアンサー

ブラウザで見ると
[返信]
って感じになり「返信」のトコだけ下線付きのリンクになります。
「[」と「]」は単なる文字ですよ(笑)

Q
の場所は?

CGIでデータを受け渡しするアンケートを作っています。html中に書く<form method=post action="***.cgi">~</form>“~”の場所についてですが質問項目を全て挟まなくてはいけませんか?実は、チェックボックスの「最大2つまで回答可」という部分をJavascriptでチェック個数を超えてチェックした時点でアラートが出るようにしてます。その記述中にすでに<form>~</form>タグを制限をかけたい質問に置いているので、質問全体を<form method=post action="***.cgi">~</form>でくくると入れ子になってしまいます。大丈夫ですか?

Aベストアンサー

<form method=post action="***.cgi" name="form1">~</form>
にする。つまり「最大2つまで回答可」という部分だけをonclickでJavascriptを呼び出したらいいと思います。

Q1-man.netでメールフォームの設置がうまくいきません

1-man.netというサーバーでホームページを運営しています。
今回メールフォームを設置しようとしたのですが、
どうもうまくいきません。

KENT-WEBさんのPostMailを使用しています。
(1)http://www.1-man.net/faq/faq-sc106.html#SC106
(2)http://www.1-man.net/faq/faq-sc107.html#SC107
(1)~(2)のようにPealとsandmailへのパスを変更したのですが、
正常に動作しないのでさらに調べたところ、
(3)http://www.1-man.net/user/faq/faq-sc08.html#SC08
(3)のように-fオプションを指定すればいい、
というところまでわかりました。

しかし、「kent-webのpostmail.cgiの場合」の説明の
「user\@domain.netの部分はユーザによって異なります」
の部分がどう異なるのかわからず、
具体的にどう変更すればいいのか困っています。

ドメインがxxxxx.comの場合はここをこう変更する、
といった例を出して説明していただけるとありがたいです。

どうかよろしくお願いします。

1-man.netというサーバーでホームページを運営しています。
今回メールフォームを設置しようとしたのですが、
どうもうまくいきません。

KENT-WEBさんのPostMailを使用しています。
(1)http://www.1-man.net/faq/faq-sc106.html#SC106
(2)http://www.1-man.net/faq/faq-sc107.html#SC107
(1)~(2)のようにPealとsandmailへのパスを変更したのですが、
正常に動作しないのでさらに調べたところ、
(3)http://www.1-man.net/user/faq/faq-sc08.html#SC08
(3)のように-fオプションを指定すればいい、
とい...続きを読む

Aベストアンサー

#1です。
ごめんなさい。嘘をついたっぽいです。
http://www.linux.or.jp/JM/html/sendmail/man8/sendmail.8.html

「下記のサーバーをご利用のお客様はご利用のcgiに-fオプションを指定してください。 この現象はsendmail 8.12 以降での仕様変更による TLAS の仕様によるものと同じで サーバ(ns**.kabir-ken.com)上で構成された仮想サイト1の登録ユーザ、user1がメールを送信しようとすると、 "user1@ns**.kabir-ken.com"というユーザは存在しないためエラー(virtusertable) になります。 この現象を回避する為に-fオプションを指定してください。 」

ということなので、存在するユーザのID(メールアドレス)を記入すればいいのではないかと思います。


このカテゴリの人気Q&Aランキング

おすすめ情報