-PR-
解決済み

if文データの別ファイル化について

  • 困ってます
  • 質問No.36261
  • 閲覧数49
  • ありがとう数3
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 13% (3/22)

金星と火星の「○年○月○日は○座」というのがわかっていて,
それを入力された年月日と比較して答えを出してるのですが、
数年間のデータを全部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'});
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル12

ベストアンサー率 61% (349/567)

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

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

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

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

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

で書式を定義してやればいいと思います。
お礼コメント
siritay

お礼率 13% (3/22)

参考にさせていただきます。ご回答ありがとうございました。
投稿日時 - 2001-02-07 08:01:20
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル12

ベストアンサー率 61% (349/567)

ひとつの考え方ですが、私なら日付→星座データを別ファイルにしてしまうと思います。呼ばれる頻度が多いとパフォーマンス的には苦しいかもしれませんが。
-------------------------
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};と直接呼ぶというのもありかもしれませんが、あまり差がないようにも思います。
とにかくコーディングが楽にということであれば、ひとつの案ということで。
(やや無理やりの感じがしないでもありません(苦笑))
補足コメント
siritay

お礼率 13% (3/22)

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

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

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

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


このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ