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インストール前のチェックではインストールしていないとエラーが
出ていたのでインストールに失敗したとも思えない状態です。
どなたかおわかりの方がいましたらアドバイスをお願いいたします。
※ほかにも必要な情報がありましたら返信をお願いいたします。
No.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になっている
・「日付に誤りがあればメッセージを表示する」と出力されていたら、判定箇所は通っている
といったことから、どこが原因となっているか判断する材料になります。
早速回答していただいてありがとうございます。補足では文字数オーバーだったのでお礼に
記述させていただきます。
こちらの内容を確認しながら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文を記述してきちんと動いているかのチェックを
したいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Visual Basic(VBA) Excel VBAの解読について質問があります。 概要は、マクロでチェックボックスにチェックすると日 1 2023/02/10 07:50
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) パーソナルXLSBのfuctionを呼び出すと「Functionが定義されていません」のエラーになる 2 2022/08/22 22:51
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Access(アクセス) ExcelのVBAコードについて教えてください。 4 2023/01/20 09:44
- Excel(エクセル) Excel2019、2021の日付、曜日の表示について 2 2022/11/29 15:01
- Excel(エクセル) 「休日取得希望日」を申請したらシフト表に色付け 1 2022/04/17 14:22
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Excel(エクセル) DATE関数で指定する「日」のセルが関数の場合の対処法 5 2022/09/14 15:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【至急!!!】python言語で本を見...
-
linuxにおけるCの自作ヘッダフ...
-
perでメールが送信出来ない場合...
-
Perl>「対話形式+ファイルを...
-
数値かどうかの判定方法
-
pythonで改行を含めてfindする方法
-
シェルで、ランダム関数を変数...
-
関数「exists」と「defined」の...
-
CGIでimgタグでalignを使うとエ...
-
シェルスクリプトで、空白(ス...
-
Net::FTP使用時の取得値をどう...
-
Pythonでコンソールをクリアす...
-
N88-日本語 BASIC ASCII ファイル
-
pythonの*
-
変数まとめて0に初期化する方...
-
16進の10進変換について
-
パイソンのクラスについて
-
JSONで文字列が長い時
-
Application.ScreenUpdating = ...
-
文字の横にプルダウンを表示さ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Pythonでターミナルに文字を出...
-
16進の10進変換について
-
パイソンのクラスについて
-
【至急!!!】python言語で本を見...
-
シェルスクリプトで、空白(ス...
-
I2C接続のLCDディスプレイを使う
-
int(input("○○"))の使い方
-
数値かどうかの判定方法
-
pythonで演算子を変数に代入す...
-
awkの正規表現での最左最短マッ...
-
Pythonでコンソールをクリアす...
-
pythonを使ったプログラミング...
-
c言語 16進数の2進数への変換
-
関数「exists」と「defined」の...
-
ソケットでのデータ送受信につ...
-
pythonの*
-
Perlの例文でif($a==1&&$b==5&&...
-
数値をスラッシュで区切る方法
-
変数の中は文字列か数値か調べ...
-
PythonでUTF8の文字列をリスト...
おすすめ情報
申し訳ありません。改めて確認しましたらHTML出力部分の記述がおかしくて変な場所に
日付に誤りがあるメッセージが表示されていました。
XAMPPの設定やモジュールのインストールで失敗ばかりしていたため、他の箇所を確認
する余裕がなかったみたいです。
ご迷惑をおかけして申し訳ありませんでした。