プロが教える店舗&オフィスのセキュリティ対策術

Perlの勉強が必要になった初心者にすら到達していないど素人からの相談です。
現在『つくって覚えるPerl入門』を読みながらPerlの勉強をしているのですが、
モジュールのDate::Simpleをインストールして下記の内容のplファイルを作成
したのですが、実際に日付でありえない日などを入力しても日付に誤りがあります
と表示してくれない状態です。

# 日付チェック
use Date::Simple;
if ($pdate eq Date::Simple::date($pdate)){
$date_check = 'ok';
} else {
$date_check = 'error';

中略

# 日付に誤りがあればメッセージを表示する
if ($date_check eq 'error') {
print '(日付に誤りがあります)';

Perlの -cw のチェックでもOKが出ますし、Web上でもエラーは出ないのですが、
メッセージを表示してくれません。

Date::Simpleインストール前のチェックではインストールしていないとエラーが
出ていたのでインストールに失敗したとも思えない状態です。

どなたかおわかりの方がいましたらアドバイスをお願いいたします。

※ほかにも必要な情報がありましたら返信をお願いいたします。

質問者からの補足コメント

  • つらい・・・

    申し訳ありません。改めて確認しましたらHTML出力部分の記述がおかしくて変な場所に
    日付に誤りがあるメッセージが表示されていました。

    XAMPPの設定やモジュールのインストールで失敗ばかりしていたため、他の箇所を確認
    する余裕がなかったみたいです。

    ご迷惑をおかけして申し訳ありませんでした。

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/01/25 23:02

A 回答 (1件)

○実行方法は?


Web上云々とあるので、CGIとして動作させているようにも思えますが、どうなのでしょうか?

○他の箇所は正しいですか?
Webだとすると、他のメッセージ等はちゃんと表示されているのですか?
それとも、「日付に誤りがあります」だけが出てこない状態ですか?

他のも表示されないということなら、Perlからの出力はされているけど、HTMLとして正しくないので表示されないだけ、ということも考えられます。



こういうときの原因としては
○ if ($date_check eq 'error') { が成立していない
 ・ $date_check に正しい値が入っていない
 ・ $date_check に正しい値が入っていたのに書き換えてしまっている
 ・比較するべき文字列が 'error' ではない
○ この判定箇所自体が実行されていない。
 ・他のif文とかで、break,return 等があり、この箇所の実行自体していない
等が考えられます。


まずは、原因をつきとめましょう。


古来より伝わるデバグ技術に「printデバグ」というものがあります。
要所要所に「print」で経過や気になる変数の内容等を出力し、期待通りになっているかをチェックするものです。

例えば
print "pdata=${pdate}\n";
if ($pdate eq Date::Simple::date($pdate)){
print "チェックOK\n";
$date_check = 'ok';
} else {
print "チェックNG\n";
$date_check = 'error';

....
# 日付に誤りがあればメッセージを表示する
print "日付に誤りがあればメッセージを表示する\n";
print "date_check=${date_check}\n";
if ($date_check eq 'error') {
print '(日付に誤りがあります)';

等とすると
・pdataが正しいはずがNGになっている/ 正しくないはずがOKになっている
・「日付に誤りがあればメッセージを表示する」と出力されていたら、判定箇所は通っている
といったことから、どこが原因となっているか判断する材料になります。
この回答への補足あり
    • good
    • 0
この回答へのお礼

早速回答していただいてありがとうございます。補足では文字数オーバーだったのでお礼に
記述させていただきます。

こちらの内容を確認しながらprint文を入力したらいきなりエラーが出たので
確認しましたら、malformed header from script. Bad header と出ていて
これがHTTPヘッダーを出力しないといけないとあったので、ファイル内でHTTPヘッダーを
出力する

print $cgi -> header(-type=>'text/html',-charset=>'Shift_JIS');
print $cgi -> start_html(-title => 'アンケート', -lang => 'ja');

この文以降に改めて日付チェックの内容を入力したらきちんと日付に誤りがありますと
表示してくれました。

入門書には日付チェックの内容がHTTPヘッダー出力よりも前に記述してあったので、
そのまま記述していました。そして数値チェックである

if ($pprice =~ /^\d*$/) {
$num_check = 'ok';
} else {
$num_check = 'error';

こっちはHTTPヘッダーの前に記述していたのに問題はなかったため、原因がいまいち
理解できない状態です。もしお手数でなければこちらの原因についてご教授いただけ
ませんでしょうか。

こうなるとあまり意味がないかもしれませんが

○実行方法は?
→ローカルホストでhtmlファイルを読み込みそこにデータを入力してplファイルを
呼び出しているのでcgiの動作チェックになると思います。

○他の箇所は正しいですか?
Webだとすると、他のメッセージ等はちゃんと表示されているのですか?
それとも、「日付に誤りがあります」だけが出てこない状態ですか?
→こちらはほかの個所は全く問題がなく(数値チェックもひらがななど入れたら
きちんと数値に誤りがありますと表示されました)日付に誤りがありますだけ
メッセージが出ない状態でした。

printデバグという方法を教えていただいてありがとうございます。今後も何か
あったらその命令の下にprint文を記述してきちんと動いているかのチェックを
したいと思います。

お礼日時:2016/01/25 22:43

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