• ベストアンサー

Perlで分数を保持したい

初心者です。 Perlで分数を保持したいのです。以下のように記述しましたが、保持できていないようです。。 とりあえず整数で持ってきて、Perl内で分数に置き換えるということを考えていますが面倒そうです。分数で直に持ってこられる方法がありましたら教えてください。 Perl内記述 #Q1シングル for ($i=0;$i<=97;$i++){ $val_name ="Q1_"."$i"."_chk"; $name = 'Q1'; if ($data{$name} eq "$i"){ $$val_name = ' checked'; }else{ $$val_name = ''; } } HTML内記述 <TR height="25"> <TD align="center"><INPUT type="radio" name="Q1" value="1/3" _Q1_1/3_CHK_></TD> <TD>A</TD> </TR> ちなみに上記記述において、1/3の部分が整数であればこのプログラムは正常に動きます。なので1/3の持ってきかただけなのですが、 お願い申し上げます。

質問者が選んだベストアンサー

  • ベストアンサー
  • g_p_
  • ベストアンサー率53% (28/52)
回答No.4

もしかして、望んでいるのは my $result = 1/2 + 1/3; print $result; こんな風にしたら、 5/6 と計算して表示するようにしたいって事ですか? もしそうなら、それについては、 できるとか、できないとか、正確な解答ができませんが、 言えるのは、 >整数であれば何の問題もないのですが という事なんで、整数だけでうまく行く様に仕様を見直した方が 最終的には早く仕事が終わると思いますよ。

kujitan
質問者

お礼

お礼が遅くなり申し訳ありません。 さんざん悩んだ挙句、整数で仕様を見直しました。。。 皆様にいろいろとアドバイス頂いたにもかかわらず、技術が伴わず、かといって時間もかけられず、、で悔しい思いをしました。 これを機につけやきばではなく、しっかりと勉強しなおさなければならない、、と思いました。 ありがとうございました。

その他の回答 (3)

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.3

こんにちは、 >回答の値を分数で受け取って… >1/2、1/3というデータでは計算ができないようなのです。… すみません、まだ良く理解できません。 ラジオボタンの値に"1/2"を指定しておいて、 渡されたスクリプト内部で、0.5 として扱いたいという事ですか? もしそうなら、受け取った計算式を eval してみてはどうでしょうか 以下実験です。 #! /usr/bin/perl use strict; use CGI; my $q = CGI->new; my $Q1_value = $q->param("Q1") || 'ありません'; my $result_eval = eval $Q1_value; print << "END_OF_HTML"; Content-Type: text/html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> </head> <body> <form action="test.cgi" method="POST"> <input type="radio" name="Q1" value="1/3"> <input type="submit" value="reload"> </form> <p>受け取ったQ1の値は$Q1_value</p> <p>$Q1_value の実行結果は $result_eval</p> </body> </html> END_OF_HTML __END__ ブラウザから、ラジオボタンをチェックしてボタンを押すと ________________________________________________________ 受け取ったQ1の値は1/3 1/3 の実行結果は 0.333333333333333 ________________________________________________________ と表示されると思います。 でも、重大なセキュリティホールが出来てしまいそうなので、 渡された文字列を厳重にチェックしなければならないと思います。 なぜ、 >「例:非常にそう思う⇒5、ややそう思う⇒4、、など」の整数であれば何の問題もないのですが これではだめで、 >「例:非常にそう思う⇒1/2、ややそう思う⇒1/3、、など」 こうしなければならないのでしょうか? もしかしたら、それが分かればもうちょっとマシな回答ができるかもしれませんが…(自信は無いですけど)

kujitan
質問者

お礼

お礼が遅くなり申し訳ありません。 さんざん悩んだ挙句、整数で仕様を見直しました。。。 g_p_様にいろいろとアドバイス頂いたにもかかわらず、技術が伴わず、かといって時間もかけられず、、で本当にすみません。 >「なぜ、 >「例:非常にそう思う⇒5、ややそう思う⇒4、、など」の整数であ >れば何の問題もないのですが >これではだめで、 >「例:非常にそう思う⇒1/2、ややそう思う⇒1/3、、など」 >こうしなければならないのでしょうか? 理由は、その後、その解答データを 配列で考えると(1,0)が「2」なら(0,1)は「1/2」、(1,2)が「1/3」なら(2,1)が「3」と逆数を計算をするのですが、 そのためにある回答が得られたら、1/2、という設定が欲しかったのです。。まずは整数で持ってきて、分数に置き換える方法で最終的には処理しました。

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.2

こんにちは、 いまいちおっしゃりたい事が分かりませんが、 >Perlで分数を保持したいのです。 ><TD align="center"><INPUT type="radio" name="Q1" value="1/3" _Q1_1/3_CHK_></TD> htmlのフォームから送信された Q1 の値を '1/3' という文字列で受け取りたいという事でしょうか? CGI.pmや類似のモジュールを使ってフォームに入力された値を受け取っているなら、 普通そうなると思うんですが、以下実験です。 #! /usr/bin/perl use strict; use CGI; my $q = CGI->new; my $Q1_value = $q->param("Q1") || 'ありません'; my $str = "1 / 3"; my $result = 1 / 3; my $result_int = int($result); print << "END_OF_HTML"; Content-Type: text/html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> </head> <body> <form action="test.cgi" method="POST"> <input type="radio" name="Q1" value="1/3"> <input type="submit" value="reload"> </form> <p>受け取ったQ1の値は$Q1_value</p> <p>文字列 $str</p> <p>1 / 3 は $result</p> <p>1 / 3 の整数部は $result_int</p> </body> </html> END_OF_HTML __END__ 上記のスクリプトを test.cgi として保存(文字コードはeuc-jp)。 ブラウザからラジオボタンをチェックしてボタンを押すと、 ___________________________ 受け取ったQ1の値は1/3 文字列 1 / 3 1 / 3 は 0.333333333333333 1 / 3 の整数部は 0 ___________________________ と表示されると思います。 >ちなみに上記記述において、1/3の部分が整数であればこのプログラムは正常に動きます スクリプト内のどの部分が整数になれば良いのかわかりませんが、int を使ったらどうですか? 質問を見ただけでは、やりたいことが分かりませんが、 #1氏のご指摘通り、ハッシュや配列を使って解決できるように考えられた方が良いと思います。

kujitan
質問者

補足

ご回答ありがとうございます。 説明が足りず申し訳ありません。 アンケートを作成していて、回答の値を分数で受け取って、「例:非常にそう思う⇒1/2、ややそう思う⇒1/3、、など」そのデータを使ってPerl内で計算したいのです。 「例:非常にそう思う⇒5、ややそう思う⇒4、、など」の整数であれば何の問題もないのですが、1/2、1/3というデータでは計算ができないようなのです。 ご回答いただいた内容を拝見して、1/2、1/3が文字列として受け取られてしまっているのか、と考えなおしています。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

スクリプトを見た感じ、その分数の表記をそのまま 変数名として使おうとしていますよね? '/' は変数名に使うことはできないので、 それで期待通りに動いていないのだと思います。 >$$val_name = ' checked'; のようなシンボリックリファレンスを使うのではなく、 ハッシュを使うようにして、 > "Q1_"."$i"."_chk"; の結果をハッシュのキーにすればよいのではないでしょうか? 参考までに、現状ではこのようなシンボリックリファレンスを 使うことはコーディングルールとして推奨されていません。

kujitan
質問者

お礼

ご回答ありがとうございます。 変数に使えない記号というのを確認しました。 実は前にあるSEの方に組んで頂いたPerlを数年にわたってカスタマイズしながら使っています。私自身プログラムについては全くの素人で、質問が初歩的で本当にお恥ずかしい思いです。 配列、という考え方で再度見直してみます。 大変ありがとうございました。

関連するQ&A