金星と火星の「○年○月○日は○座」というのがわかっていて,
それを入力された年月日と比較して答えを出してるのですが、
数年間のデータを全部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'});
No.1
- 回答日時:
ひとつの考え方ですが、私なら日付→星座データを別ファイルにしてしまうと思います。
呼ばれる頻度が多いとパフォーマンス的には苦しいかもしれませんが。-------------------------
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内容をどのように記述
すれば良いのでしょうか?
No.2ベストアンサー
- 回答日時:
>日付をYYYYMMDD形式にして、$dateで送ります。
この部分ですか?
生年月日をHTMLからFORMで記入していただくわけでしょうか。でしたら、monthとdayのvalueを文字列で2桁にしておいて(02とか03ということですね)、単純につないでやれば大丈夫じゃないでしょうか。
$date = $year . $month . $day;
うまく2桁で渡ってこないようでしたら、
$date = sprintf("%04d%02d%02d",$year,$month,$day);
で書式を定義してやればいいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 今日の日付が過ぎたらその行を削除したい 1 2023/04/01 20:06
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- WordPress(ワードプレス) wordpressでphpを読み込みたい 1 2022/10/30 23:40
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- 宇宙科学・天文学・天気 室蘭や苫小牧の8月中旬の平年の最高気温が下旬よりも低いのはなぜですか。 2 2022/08/20 22:28
- 宇宙科学・天文学・天気 仙台で積雪量が増えたのに降雪量や天気概況には雪が降らなかった観測結果が出ることが最近多くなっている。 1 2023/02/01 19:16
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- 宇宙科学・天文学・天気 室蘭や苫小牧の8月中旬の平年の最高気温が下旬よりも低いのはなぜですか。 1 2023/06/05 20:18
- 英語 "this day"が当日か今日を表すのかの使い分け方等について 5 2023/08/08 14:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
前日の日付取得するには?
-
Perlでsprintf("%02d",$month)...
-
1桁の日付に0を付ける
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
formで特定のinputを送信しない...
-
<SELECT>タグの折り返し
-
16進の10進変換について
-
実行時エラー 3020の対策
-
文字の横にプルダウンを表示さ...
-
デ-タテ-ブルの内容での更新...
-
セレクトメニューで2つの項目...
-
数値英単語変換
-
セレクトボックスのselected属...
-
複数列を持ったリストボックス...
-
selectタグ内の特定のoptionの...
-
【メモリ不足で落ちる(python)】
-
STLのlistで重複するものだけを...
-
【至急!!!】python言語で本を見...
-
パイソンのクラスについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlでsprintf("%02d",$month)...
-
1桁の日付に0を付ける
-
日齢計算プログラム
-
Perlの日付の比較に関して
-
当日の日付をプルダウンメニュ...
-
Cookieの有効期限について
-
CSVファイルに出力
-
日付の差分の求め方(日、分)
-
うるう年の出し方
-
Schemeのプログラミング うる...
-
Perlで60進数を作りたい
-
PHPのstrtotimeのようなものあ...
-
2つの日付・時間の差分を求め...
-
a shower.
-
日付範囲をの連番と月末を取得
-
体重が3kg増える/減る の英語...
-
C言語でのPICプログラミング
-
前日の日付取得するには?
-
ソースの詳細を教えてください。
-
PerlからMysqlに接続してデータ...
おすすめ情報