WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:perlを使用しての足し算

0:[投稿] ゆみ [2003/04/22 20:27 ][環境:WINXP Apache?]

perlについて初心者です、どうぞよろしくお願いいたします。
現在フリーCGIを利用して改造している最中です。

悩んでいるのは、データ登録フォームがありいろいろな内容を
記入するページがあるのですが、その中の1つに5項目ほど
数字を入力をする項目があります。
この合計を次のページのデータ入力確認画面で
表示させたいのですが、いろいろと自分なりに調べたのですが
エラーばかり出てどうやっていいものかわかりません。
その他の項目については入力した項目が確認画面で表示も
できているのですが、合計だけはどのような
計算式の設定があるのかわからない状態です。
また、その合計をデータとして保存しておきたいとも
思っております。
他のデータ情報を保存することに関しては
どうにかできております。

このフリーCGIは
<INPUT size="5" type="text" name="****" value="$DATA{*****}">
というような形で、データの保存・データプレビュー画面へ
データを受け渡す?ように、なっているようです。

これだけの、説明では何か不足なのかもしれませんが
何かアドバイスをいただければ大変助かります。
また、必要な情報が足りないようでしたら
お手数ですがご指摘いただければ再度こちらに
記入いたします。
壁にぶちあたり、ここから先に進めず悩んでおります。
どんなヒントでもいいので、よろしくお願いいたします。


1:[回答] 薫 [2003/04/22 21:37 ]

> 数字を入力をする項目があります。
> この合計を次のページのデータ入力確認画面で
> 表示させたいのですが、いろいろと自分なりに調べたのですが
> エラーばかり出てどうやっていいものかわかりません。

1.「数字を入力をする項目」のソース
2.「いろいろと自分なりに調べたのですが」の具体的内容
3.「エラーばかり出て」のエラー内容
4.使用されている「フリーCGI」
を提示された方がレスもつきやすいです。

念のため、そのCGIは改造可能なのですよね?


2:[質問] ゆみ [2003/04/23 19:46 ]

薫さん、お返事ありがとうございます。
ダウンロードしたCGIですが著作権表示部分を
削除しない限り改造は自由ということで
規約に書かれていましたので問題はないようです。

ソースですが他の入力部分は省いてあります。
下記のような感じで現在数字を入力する項目があります。

<FORM action="$BaseDir/$MainCGI" method="POST" enctype="multipart/form-data">
<INPUT type="hidden" name="cmd" value="dra">
<INPUT type="hidden" name="SID" value="$PID">
<INPUT type="hidden" name="Count" value="0">
<TABLE>
<font size="2">ポイント入力:<font color="red">※入力必須</font> 半角英数</tr>
<table width="400" border="1" cellspacing="1" cellpadding="1">
<tr bgcolor="#FFFFCC">
   <td height="20"><font size="2"><center>1番</td>
   <td height="20"><font size="2"><center>2番</td>
   <td height="20"><font size="2"><center>3番</td>
   <td height="20"><font size="2"><center>4番</td>
   <td height="20"><font size="2"><center>5番</td></tr>
<tr bgcolor="#CCFFCC">
   <td height="23"><INPUT size="5" type="text" name="point1" value="$DATA{point1}"></td>
   <td height="23"><INPUT size="5" type="text" name="point2" value="$DATA{point2}"></td>
   <td height="23"><INPUT size="5" type="text" name="point3" value="$DATA{point3}"></td>
   <td height="23"><INPUT size="5" type="text" name="point4" value="$DATA{point4}"></td>
   <td height="23"><INPUT size="5" type="text" name="point5" value="$DATA{point5}"></td></tr>
</table>
<table width="600"><TR><TD><br><center><INPUT type="submit" value="登録" style="cursor : hand;">&nbsp;
<INPUT type="reset" style="cursor : hand;">
<INPUT type="checkbox" name="Preview" value="1"><font size="2">プレビュー</TD></TR>
<TR><TD height="20"></TD></TR></TABLE></FORM><HR></BODY></HTML>

エラー内容自体どういう意味のものなのかが、
わからないのですが英語で表示されていました。
そのときの内容をコピーしておかなかったので
現在はわからないのですが、申し訳ありません。

私の調べ方が足りないとは思いますが
ほとんどの場合a=1 b=5というようにはじめから
一定の数字を代入しての計算方法しかみつけることが
できませんでした。
またjavascriptで計算ができるというのを知ったので
この方法でも可能なのかと思ったのですが、
データの保存方法がわからずにいます。

初心者のため、どのように説明していいのかが
わからず言葉の意味がわかりにくいかと思いますが
どうぞよろしくお願いいたします。


3:[回答] 薫 [2003/04/24 11:53 ]

HTMLの記述が間違っているようですが、
とりあえずそれは置いておくとして...

> ほとんどの場合a=1 b=5というようにはじめから
> 一定の数字を代入しての計算方法しかみつけることが
> できませんでした。

応用すれば良いだけなので、そんなに難しく考えなくても大丈夫です :-)
恐らく、デコード後は%DATAに格納されているようなので、

$pointALL = $DATA{point1} + $DATA{point2} + $DATA{point3} + $DATA{point4} + $DATA{point5};

という感じで計算しておき、HTML部分に $pointALL を入れておけば
表示されるのではないかと思います。
# 全文がないので、少し憶測です


4:[回答] ゆみ [2003/04/24 19:56 ]

薫さん、いつもお返事をありがとうございます。
さっそく、自分なりにやってみました。

教えていただきました下記の設定は
cgiのファイルへ書き込むということでよろしいでしょうか?
>$pointALL = $DATA{point1} + $DATA{point2} + $DATA{point3} + $DATA{point4} + $DATA{point5};

また、$pointALL を表示させたいデータ確認画面のHTMLへ
書き込むという理解の仕方であってますでしょうか。

私が設定のときに悩むのは、どのcgiファイルに
書き込めばいいのかということです。
.cgiというファイルはいくつかあり
<FORM action="$BaseDir/$MainCGI" method="POST" enctype="multipart/form-data"> とあったので、
FORM action="$BaseDir/$MainCGI"にあたるcgiに
現在は設定しました。
しかし、データ確認画面には合計は表示されませんでした。
ただ、進歩?したのは合計部分に”0”というふうに
はじめて表示された事です。(ちょっとうれしかったです)
書き込む位置が間違えているために、
表示されないということもあるのでしょうか?
それとも、そもそもその書き込んだ.cgiファイルが
違ったのでしょうか?

何か少しでもヒントがありましたら、
どうぞよろしくお願いいたします。


5:[回答] 薫 [2003/04/25 09:44 ]

計算式と変数の記入個所の解釈はOKです :-)

> 書き込む位置が間違えているために、
> 表示されないということもあるのでしょうか?
> それとも、そもそもその書き込んだ.cgiファイルが
> 違ったのでしょうか?

合計が表示されるべき部分に、空欄ではなく0が出た、ということは
計算式そのものは通過(実行)していると考えられます。

それを証明するためには、計算式の部分を
$pointALL = "TEST";
などに変えてみると分かると思います。

この「TEST」が表示されたならば、
1.計算式そのものが間違っている
2.変数に数字が入っていない
のどちらかではないかと。

2.が原因の場合は、デコードの前に計算を行っている可能性がありそうなので、
デコードルーチンの後に計算式が来るようにしましょう。
# 多分、「&decode(*DATA);」とかだと思いますが...
HTML表示の直前でもいいかもしれませんね。
頑張ってください


6:[質問] ゆみ [2003/04/26 13:15 ]

こんにちは、薫さん。
いつもアドバイスありがとうございます。
昨日やってみたのですが、結論が出ず再度
何かアドバイスをいただけたらと思います。
よろしくお願いいたします。

まず、はじめに教えていただいたように
>$pointALL = "TEST";
に変更して実行してみました。
そうしますと、データ確認画面ではTESTというように
表示されていました。

そして原因があるとしたらということで、
ヒントをいただいた2.について教えていただければ
大変ありがたいです。
デコードの意味は今回調べてみて
ある程度理解したつもりですが、
>&decode(*DATA);
を、実際書き込めばいいとしますと
どのファイルに当たるのでしょうか?

HTML表示の直前かもしれないとありましたので、
はじめにデータを入力するHTMLファイルの
<head></head>の間に書き込んで見ました。
どうやら結果には特に反映されないようなので
次にデータ確認画面HTMLに試してみました。
こちらも同様に合計数は0のまま変化はありませんでした。
書き込む位置としては合ってましたでしょうか?

とても初歩的な話で申し訳ございませんが、
”デコードルーチンの後”とは
通常どのような感じの設定部分に当たるのでしょうか?
また、設定されてる場合どのような位置に
たいていはあるものでしょうか?
ヒントをいただけましたら、自分でさがしてみたいのですが
このような感じというのを教えていただければ
ありがたいです。

本当にお時間があるときでかまいませんので、
また何かヒントがありましたらよろしくお願いいたします。


7:[回答] マイム野口 [2003/04/27 16:21 ]

ゆみ さん はじめまして。
アドバイスできるほどの知識は、無いのですが
より多くのアドバイスを得るために、もう少し詳しい情報を、公開された方が良いように感じます。

まず、cgiファイルの数と各ファイル名(実名でなくても可)、少なくとも投稿欄2のリストのファイル名とデーターを表示するファイル名($MainCGI)がわかると、より詳しくアドバイスが得られると思います。
 次に、この2つのcgiファイル(もしかすると1つのcgiファイルかも)のリストのHTMLファイルを記述した部分の1〜2行前に「print <<"here";」hereの部分は適当な語句になっていると思いますが、
「print <<"here";」以前の10行程度とHTMLファイルを記述部分のリストがあると、より詳しくアドバイスを得られると思います。
薫 さんが言われている&decode(*data);の後とは、sub decode{???}処理のあとと言う意味だと思います。リストの具体的な位置を指している(リストの位置であると言えば、そのとおりなのですが)ものではないと思います。
$pointALL = $DATA{point1} + $DATA{point2} + $DATA{point3} + $DATA{point4} + $DATA{point5};の処理を送信前にするのか、
表示処理前にするのか、(javascriptで合計をするのも可)方法はいろいろあると思います。
何のお役にも立てず申し訳有りませんが、情報を追加される事をお勧めします。


8:[回答] ゆみ [2003/04/29 20:04 ]

マイム野口さん、アドバイスありがとうございます。
パソコンの調子が悪く、返事が遅れてしまい申し訳ございませんでした。

アドバイスいただいた件ですが、cgiの数は15以上あり
私にとってはどのcgiがどんな動きの設定をしているのか
ほとんどわからない状態です。
ただ、今私がやってみたいところに関しては
おそらく$MainCGIにあたるdatabase.cgiと
db-data.cgiの二つで動いているのかな?と見当をつけています。
投稿欄2であげたHTMLですがdata-regist.htmlになります。
そして、そのデータ入力後の確認画面は
data-regist-preview.htmlになります。
data-regist.html内で、printと書かれているところの
上部分が下記のとおりになります。

print <<"<!---HTML--->";
<HTML><HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>$CNF{ScriptName} [ポイント登録]</TITLE>
<STYLE type="text/css"><!--
A{color : #6666CC;}
A:VISITED{color : blue;}
A:HOVER{color : #ff0099;}
A:ACTIVE{color : #ff0099;}
FORM{margin-top : 0px;margin-left : 0px;margin-right : 0px;margin-bottom : 0px;}
--></STYLE></HEAD><BODY><A name="TOP"></A>
<!---HTML--->
&_Html_Head1;
print <<"<!---HTML--->";

このすぐ下に<form action=・・・と続きます。
もしかしたら、違う部分のことをおっしゃっていたのでしょうか?
なんとなくですが、上記の内容からではわからないような気がしますが、
見当違いなところをあげているかもしれません。

このような内容で何かヒントがありましたらよろしくお願いいたします。
私自身がよくわかっていないため、かなり説明不足で
大変申し訳ありません。


9:[回答] 薫 [2003/04/29 20:53 ]

大抵のCGIだと、デコードルーチンは後ろのほうに書いてあり、
>&decode(*DATA);
といった形で呼び出しているのではないかな、という予測でした。

既に調べられたかも知れませんが、デコードとは
エンコードで渡されたフォームの値を、組み立て直す事です。
# 大体そんなところです(笑

if($ENV{REQUEST_METHOD} eq "POST){
@pair = split(/&/,$ENV{QUERY_STRINGTH});
 :
 :
のような記述があると思いますが、そこで「デコード」を行っていますので、
そのルーチンを実行して初めて%DATAに値が格納されていきます。
なので、それより前に追加の足し算があると、値が「0」になってしまうわけです。

まず、手っ取り早く(?)解決しそうな案としては
print <<"<!---HTML--->";
の直前に追加の足し算を入れてみてください。

マイム野口さんのいわれるように、情報不足で具体的な回答ができない、というのもあります。
スクリプトが公開可能であれば、テキストの状態でUPして
URLを記述頂ければ、もう少し詰めた回答ができるかもしれません。


10:[関連] 薫 [2003/04/29 21:03 ]

>>6 で「自分で探してみたい」とのことでしたので、
こちらなど参考になりそうです。
http://poizun.jp/content/cgitukurou/decoo.html

他にも「perl サブルーチン デコード」などのキーワードで検索するとよさそうです。


11:[回答] マイム野口 [2003/04/29 21:22 ]

こんばんわ、ゆみさん。

CGI初心者の私が、アドバイスできることは限られています。
現状与えられた情報から、極わずかな知識をベースに想像してみます。
データを入力する1・HTML(data-regist.html)を出力するcgiファイル名をinput.cgiととすると、ここで得たデータは変数$MainCGIの中身database.cgi(※確認する必要有り)に渡されています。
このdatabase.cgiが出力する2・HTML(data-regist-preview.html)にて、受信したデータを表示するようになっているのかなと想像しています。
仮に実験的に、$pointALLを2・HTMLの中に埋め込んみ表示させるためには、送信前か、表示前に$pointALL = $DATA{point1} + $DATA{point2} + $DATA{point3} + $DATA{point4} + $DATA{point5};の作業が必要になります。この作業はHTMLでは、できないと思います。仮にこの作業を、2・HTMLの直前で行うとして、
この作業ラインを埋め込むとするなら、2・HTMLの前にあるprint <<"<!---HTML--->";の1または2行前に書き込む可能性が高いと思います。そのために投稿7で「print <<"here";」以前の10行程度とHTMLファイルを記述部分・・・と書かせて頂きました。この10行程度をみると、あくまで推測ですが、上記の作業ラインを挿入する場所がわかるかも?と考えた訳です。

もしかすると、私が仮に命名したinput.cgiは、database.cgiで有るかもしれません。プログラムリストの中を検索すると目的のものが、場所がわかりやすくなります。例えば$MainCGIを検索すると$MainCGI = "database.cgi";と表記されているかもしれません?

>おそらく$MainCGIにあたるdatabase.cgiと
>db-data.cgiの二つで動いているのかな?と見当をつけています。
上記のdb-data.cgiは、本来というか実質はdb-data.txtつまりデータ格納ファイルかもしれません。拡張子をcgiとすることで安易に中身を表示させないため?

またまた、お役に立てず申し訳なく思います。
あきらめずに、1つ1つ解決してください。


12:[回答] マイム野口 [2003/04/29 21:54 ]

ダブったようです。なにぶん初心者なので、お許し頂きたい。
> こちらなど参考になりそうです。
> http://poizun.jp/content/cgitukurou/decoo.html
おかげさまで?良いところを教えて頂き有り難うございます。


13:[質問] ゆみ [2003/04/30 20:10 ]

こんばんは。
薫さん、マイム野口さんいつも丁寧な回答に感謝いたします。

まずは、薫さんから教えていただきました
サイトで一度勉強をしてみようと思っています。
そして教えていただくには情報が少なすぎるということが十分わかりましたので、その部分をテキストで見ていただけるよう
アップしてみます。
ですが、私事でもうしわけないのですが
明日から3週間ほど家をあけるため、すぐにアップが
できないのですが、もしその時まで気にとめていただけていれば
書き込ませていただきますので、どうぞよろしくお願いいたします。

1つだけ質問させていただいてよろしいでしょうか。
現在database.cgiに教えていただきました計算式を入れています。
その結果は残念ながら0というふうに表示されてしまいますが、
他のcgiではなく、このcgiに書き込んだ事自体は間違えではないと考えていいのでしょうか?
もしそうなら、あとは書き込む場所を見つければいいということになるのでしょうか。

それでは、またご連絡させていただきます。
ここまで付き合ってくださって本当に感謝しております。m(_ _)m
PS $MainCGI = "database.cgi";という箇所をみつけましたので
これはあっていたようです。


14:[質問] ゆみ [2003/04/30 20:19 ]

先ほどの続きですが、database.cgiの中に
下記のような設定がありましたが、
これはあまり関係なかったでしょうか?
なんとなく、教えていただいた内容に似ていたものですから
念のためコピーしてみました。

###################
#   GetFormData   #
###################
sub GetFormData{ my$divided=shift; my$buff;
if($ENV{REQUEST_METHOD} eq 'POST'){
   if($ENV{CONTENT_TYPE}=~/^multipart\/form-data/){
       &Multipart(16384,$UpDir,100,20);
       return(1);
   }else{ ($ENV{CONTENT_LENGTH} > 50000) and &Error('送信データが大きすぎます。');
       read(STDIN,$buff,$ENV{CONTENT_LENGTH});
   }
}else{ $buff=$ENV{QUERY_STRING} }
foreach(split(/&/,$buff)){ ($key,$val)=split(/=/);
   $val=&UrlDecode($val);
   $val=~s/\t//g;
   $val=~s/(?:\r\n|\r)/\n/g;
   jcode::convert(*val,'sjis');
   if($FORM{$key} ne '' and $val ne ''){
       $FORM{$key}.="\0";
       $divided{$key}=1;
   }else{ push(@keys,$key) }
   $FORM{$key}.=$val;
}foreach(keys%divided){
   $FORM{$_}=~s/,/,/g;
   $FORM{$_}=~s/\0/,/g;
}}


15:[回答] マイム野口 [2003/04/30 22:24 ]

ゆみさん、こんばんは。
お役に立てないものです。またまたダブってしまうかもしれません。

まず、投稿14の
###################
#  GetFormData  #
###################
以下の部分が、薫さんが説明されている「デコードルーチン」の部分です。たぶん。
送信されたデータが、仮に、data1=1 data2=2 data3=3 で有るなら
「data1=1&data2=2&data3=3」このように一連のデータとしてdatabase.cgi側で受け取っています。しかし、このままでは、使えないので&を取り除き、data1=1 data2=2 data3=3として次に変数であるdata1は1であると認識できるように変数data1には1を格納する作業をしているわけです。それに文字コードをシフトJISに変換しているようです。部分的に垣間見るような、感じなので(実は知識不足)正確に解説には、なっていないかもしれませんが!!。
安易な方法ですが、まずdata-regist-preview.htmlを出力しているdatabase.cgiのプログラムリストの中で、data-regist-preview.htmlの直前にprint <<"<!---HTML--->"; のラインがあると思います。そのラインの上に$pointALL = $DATA{point1} + $DATA{point2} + $DATA{point3} + $DATA{point4} + $DATA{point5};の行を挿入して、data-regist-preview.htmlの適当な場所に$pointALLを記入すると良いのではないかと思います。
しかし、$DATA{point1}が別の変数名に変わっている事も考えられます。データ入力した1〜5までの数字を、特徴のある例えば11、22,333,444,555などの数字で入力して、この数字がdata-regist-preview.htmlでどの部分に表示されるかを見きわめて、data-regist-preview.htmlのリストを開きこの数字の部分の変数名をリストアップして、$DATA{point1}、$DATA{point2}、$DATA{point3}、$DATA{point4}、$DATA{point5}の数字と照らし合わせると、変数名が変わっているかどうかがわかります。変数名が変わっているなら、例えば$dataall = $data1 + $data2 + $data3 + $data4 + $data5;(変数名が$DATA{point1}が $data1に変更されている場合)のように変数名を変えたラインを挿入する様にして、試してみてください。挿入する$pointALLも$dataallに変更のこと。


16:[回答] 薫 [2003/04/30 23:02 ]

少し長くなりますが...

> 以下の部分が、薫さんが説明されている「デコードルーチン」の部分です。たぶん。
そうですね。先のURLにあるデコードより少し凝っていますが、
formのnameをkeyとしたハッシュに格納していますね。

> このままでは、使えないので&を取り除き
正確には「&」を区切りとして分割(split)しています。
data1=1&data2=2&data3=3
だった場合、
data1=1
data2=2
data3=3
となるわけです。

それをさらに「=」でsplitしていくわけですが、
デコードに関しての詳しい解説は割愛させてもらいますね。

しかしこれだと、%DATAではなく%FORMに格納されているようなので、
こちらの数式を使用するべきかも知れません。
$pointALL = $FORM{point1} + $FORM{point2} + $FORM{point3} + $FORM{point4} + $FORM{point5}; "

で、その数式はdatabase.cgiの頭の方に
&GetFormData;
というのがあると思うので、この行の直後に入れてみて下さい。

微妙に憶測で書いている部分もあるので、
このあたりを試してみて、うまくいったorいかなかった時は
また書き込みしてください :-)


17:[回答] 薫 [2003/04/30 23:04 ]

>>16 の数式の最後のダブルクオートはカットしてください。
# ゴミがついてしまいました...


18:[保留] ゆみ [2003/05/01 08:03 ]

おはようございます。
薫さん、マイム野口 さん、いつもすばやい回答ありがとうございます。
これからすぐ出てしまうので、3週間ほどパソコンには向かえませんが
教えていただいた部分についてじっくり見てみます。

取り急ぎお礼まで・・・
ありがとうございました。
また、戻ってきましたら報告させていただきますので
よろしくお願いいたします。


19:[完了] ゆみ [2003/05/21 19:30 ]

薫さん、マイム野口 さん、こんばんは。
現在見てくださっているかはわかりませんが、
自宅に戻ってまいりましたので、報告させていただきます。

>&GetFormData;
>というのがあると思うので、この行の直後に入れてみて下さい。
薫さんからアドバイスいただきましたとおり、
database.cgiのはじめのほうに&GetFormData;を
見つけることができました。
そして、その後に式をいれると私がやってみたかった
計算合計がちゃんと表示されました。
本当に、ありがとうございます。
かなり長い間悩んでいて、初心者の私には絶対に
解決できないものでしたので感謝のしようがございません。
説明不足にもかかわらず質問に最後までつきあっていただき、
ありがとうございました。
薫さん、マイム野口 さん、また何かありましたらよろしくお願いたします。
それでは、失礼いたします。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World