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

金星と火星の「○年○月○日は○座」というのがわかっていて,
それを入力された年月日と比較して答えを出してるのですが、
数年間のデータを全部if文で書くと,分量が非常に多くなって
しまいます。

そこで、金星と火星それぞれのデータを別ファイルにしてしまう
方法はないでしょうか?初心者なもので、なるだけ具体的に
よろしくお願い致します。

以下ソースコードです。

#以下金星のデータ
sub get_venus_data{
local($year,$month,$day)=@_;
local($horoscope)='データなし';

if($year==1950){
if($month<=3 || ($month==4 && $day<=6)){ # ~4月の6日以下
$horoscope = 'みずがめ'; # みずがめ座

}elsif($month==4 || ($month==5 && $day<=5)){ # 4月の残り~5月の5日以下
$horoscope = 'うお'; # うお座

       ・
       ・
      間省略
       ・
       ・

}elsif($month==12){ # 12月の残り~12月の31日以下
$horoscope = 'やぎ'; # やぎ座
}
}
return $horoscope;
}

#以下火星のデータ

sub get_mars_data{
local($year,$month,$day)=@_;
local($horoscope)='データなし';

if($year==1950){
if($month<=3 && $day<=28){
# ~3月の28日以下ならば
$horoscope = 'てんびん';

}elsif($month==3 || ($month==6 && $day<=11)){ # 3残り又は6/11以下
$horoscope = 'おとめ';

       ・
       ・
      間省略
       ・
       ・
}elsif($month<=12){ # 12残り
$horoscope = 'みずがめ';
}
}

return $horoscope;
}

# 入力から金星と火星の星座を求める。

$venus = get_venus_data($in{'year'}, $in{'month'}, $in{'day'});
$mars = get_mars_data($in{'year'}, $in{'month'}, $in{'day'});

A 回答 (2件)

ひとつの考え方ですが、私なら日付→星座データを別ファイルにしてしまうと思います。

呼ばれる頻度が多いとパフォーマンス的には苦しいかもしれませんが。
-------------------------
19500401,みずがめ
19500402,みずがめ

19500407,うお

-------------------------
というテキストファイルをEXCELあたりで作れば、100年分作っても3650行あまりですし、手間もそれほどかからないと思います(星座は繰り返しが多いし)。これを仮にhoroscope.txtとして。あと、日付をYYYYMMDD形式にして、$dateで送ります。

 open(HORO,"./horoscope.txt"); # ディレクトリ指定は直してください
  while(<HORO>) {
   @temp = split(/,/,$_);
   if($date=$temp[0]) { $horoscope=$temp[1]; exit; } else { next; }
  }

この場合、horoscope.txtの頭から読んでいき、マッチすれば抜けるので、よく利用される年代のデータをファイルの頭の方に置いておけば、多少速くなるでしょう。データベースに入れておけば、直接日付から星座を呼べるので、もっといいのでしょうが。マシンスペックが良ければ、horoscope.txtを連想配列に丸ごと入れて、$horoscope=$horo{$date};と直接呼ぶというのもありかもしれませんが、あまり差がないようにも思います。
とにかくコーディングが楽にということであれば、ひとつの案ということで。
(やや無理やりの感じがしないでもありません(苦笑))

この回答への補足

ご回答ありがとうございます。

>日付をYYYYMMDD形式にして、$dateで送ります。

お教えいただいた方法で試してみたのですが、
上記方法のソースコード記述の仕方がよくわかりません。

入力フォームhtmlで生年月日を入力してから、それを
テキストデータから呼び出すにはCGI内容をどのように記述
すれば良いのでしょうか?

補足日時:2001/02/04 19:47
    • good
    • 0

>日付をYYYYMMDD形式にして、$dateで送ります。



この部分ですか?
生年月日をHTMLからFORMで記入していただくわけでしょうか。でしたら、monthとdayのvalueを文字列で2桁にしておいて(02とか03ということですね)、単純につないでやれば大丈夫じゃないでしょうか。

$date = $year . $month . $day;

うまく2桁で渡ってこないようでしたら、

$date = sprintf("%04d%02d%02d",$year,$month,$day);

で書式を定義してやればいいと思います。
    • good
    • 0
この回答へのお礼

参考にさせていただきます。ご回答ありがとうございました。

お礼日時:2001/02/07 08:01

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