アプリ版:「スタンプのみでお礼する」機能のリリースについて

初心者です。
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の持ってきかただけなのですが、
お願い申し上げます。

A 回答 (4件)

もしかして、望んでいるのは



my $result = 1/2 + 1/3;

print $result;

こんな風にしたら、

5/6

と計算して表示するようにしたいって事ですか?


もしそうなら、それについては、
できるとか、できないとか、正確な解答ができませんが、
言えるのは、
>整数であれば何の問題もないのですが
という事なんで、整数だけでうまく行く様に仕様を見直した方が
最終的には早く仕事が終わると思いますよ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/09 20:35

こんにちは、



>回答の値を分数で受け取って…
>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、、など」
こうしなければならないのでしょうか?
もしかしたら、それが分かればもうちょっとマシな回答ができるかもしれませんが…(自信は無いですけど)
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ありません。
さんざん悩んだ挙句、整数で仕様を見直しました。。。
g_p_様にいろいろとアドバイス頂いたにもかかわらず、技術が伴わず、かといって時間もかけられず、、で本当にすみません。

>「なぜ、
>「例:非常にそう思う⇒5、ややそう思う⇒4、、など」の整数であ
>れば何の問題もないのですが
>これではだめで、
>「例:非常にそう思う⇒1/2、ややそう思う⇒1/3、、など」
>こうしなければならないのでしょうか?

理由は、その後、その解答データを
配列で考えると(1,0)が「2」なら(0,1)は「1/2」、(1,2)が「1/3」なら(2,1)が「3」と逆数を計算をするのですが、
そのためにある回答が得られたら、1/2、という設定が欲しかったのです。。まずは整数で持ってきて、分数に置き換える方法で最終的には処理しました。

お礼日時:2007/08/09 20:41

こんにちは、


いまいちおっしゃりたい事が分かりませんが、

>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氏のご指摘通り、ハッシュや配列を使って解決できるように考えられた方が良いと思います。

この回答への補足

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

補足日時:2007/07/30 13:55
    • good
    • 0

スクリプトを見た感じ、その分数の表記をそのまま


変数名として使おうとしていますよね?
'/' は変数名に使うことはできないので、
それで期待通りに動いていないのだと思います。

>$$val_name = ' checked';
のようなシンボリックリファレンスを使うのではなく、
ハッシュを使うようにして、
> "Q1_"."$i"."_chk";
の結果をハッシュのキーにすればよいのではないでしょうか?

参考までに、現状ではこのようなシンボリックリファレンスを
使うことはコーディングルールとして推奨されていません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/07/30 14:00

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