WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:CGIプログラムのデバック方法について(KCatch.pmについて)

0:[投稿] 白くま [2004/02/18 16:03 ][環境:windowsXP,IE6 Apache_1.3.29,ActivePerl5.8]

自分は丸の内とらさんの書いた「カスタマイズで覚えるperl&CGI」という本を使い、サンプルとしてかかれているBBSをつくりながらperlによるCGIプログラミングを勉強中の者です。
自分はどうもオッチョコチョイなので本に書いてあるプログラムを写すだけでも入力ミスをしてしまい、CGIプログラムを実行するとブラウザにInternal Server Errorがよくできてきます。
プログラムをチェックすると結局は入力ミスなのですが、この作業がなかなか骨の折れる作業で、なんとかならないものかとあれこれ調べてみたところこのような場合にはデバックを行えばよい事を知りました。
そこでperlでのCGIプログラミングの際に使われているという「KCatch.pm」というモジュールを使ってみる事にしました。

そして試しに簡単なCGIプログラムで使ってみました。

#!/usr/local/bin/perl
use KCatch qw( jcode=euc source stderr execdata );__DATA__
print "Content-type: text/html\n\n";
$number1 = 10;
$number2 = 5;
$answer = $number1 + $number2;
print "$number1 + $number2 の答えは $answer です\n";
_END_

↑このようにプログラムの2行目に
use KCatch qw( jcode=euc source stderr execdata );__DATA__
を入れてCGIプログラムを実行してみた所ブラウザに

[0401.cgi:7:die] Global symbol "$number1" requires explicit package name.
Global symbol "$number2" requires explicit package name at (eval 1) line 5, <DATA> line 9.
Global symbol "$answer" requires explicit package name at (eval 1) line 6, <DATA> line 9.
Global symbol "$number1" requires explicit package name at (eval 1) line 6, <DATA> line 9.
Global symbol "$number2" requires explicit package name at (eval 1) line 6, <DATA> line 9.
Global symbol "$number1" requires explicit package name at (eval 1) line 8, <DATA> line 9.
Global symbol "$number2" requires explicit package name at (eval 1) line 8, <DATA> line 9.
Global symbol "$answer" requires explicit package name at (eval 1) line 8, <DATA> line 9.
Bareword "_END_" not allowed while "strict subs" in use at (eval 1) line 9, <DATA> line 9.
> $number1 = 10;

というメッセージが現れました。(最後の「> $number1 = 10;」以外は全部赤い文字)
翻訳ソフトで訳してみたところ1行目は[ 0401.cgi :7 :ダイス ] グローバルなシンボル「 $number1 」は、明白なパッケージ名前を必要とする。
で、2行目はグローバルなシンボル「 $number2 」は、ライン 5 〈 DATA 〉つのライン 9 で ( eval 1 ) 明白なパッケージ名前を必要とする。との事でした(2行目以降のメッセージは2行とあまり変わらないので略します)。
このCGIプログラムはperlのパスに続く「use KCatch qw( jcode=euc source stderr execdata );__DATA__」の部分を入れなければ正常に動くプログラムです。

そこで質問なのですが、なぜこのようなエラー文が出てしまうのうでしょうか?このエラーの意味はどういうものなのでしょうか?皆さんはエラーの意味が分からない時はどうしているのでしょうか?自分が探した限りでは「KCatch」を使った時にでるエラー文の説明をしているサイトが見つからなかったのですが、そのようなサイトはあるのでしょうか?
あと「KCatch.pm」以外に初心者でも扱えるデバッグモジュールはあるのでしょうか。


1:[回答] Iwa [URL] [2004/02/18 20:56 ]

局所化されていない変数やシンボリックリファレンスやbareword(見つからないサブルーチンやファイルハンドル名)の使用に制限がかかっているだけです。
(KCatchってuse strictを使ったのと同じ効果もあったっけな?)

use vars で使う変数全部をインポートしてやりましょう。
余談ですがKCatch使わずともuse CGI::Carp qw(fatalsToBrowser);でデバックできます。
そもそもKCatchよりもこっちの方が使われてます。(標準モジュールだし)


2:[質問] 白くま [2004/02/19 22:57 ]

回答をありがとうございます。
ただちょっと分からない事があります。
「use vars で使う変数全部をインポートしてやりましょう。」
とアドバイスを貰ったのですが、インポートとは今回でいうと
use vars qw($number1 $number2 $answer);
↑こうする事ですよね?インポートの意味分からず色々調べてみたのですが、わからなくて。
あとbarewordっていうのは何の用語なんですか?ネットで調べても裸の単語という様な事しかでていませんでした。Iwaさんが「見つからないサブルーチンやファイルハンドル名」と書いてくださったので意味は分かったのですが、ちょっと気になってしまって(ただ、これは別にどうでもいいです)。

それと、上のような処理をしても「[0401.cgi:14:die] Bareword "_END_" not allowed while "strict subs" in use.」
この様なエラーが出てしまって、おそらく「_END_」の部分が引っかかってると思って最後の「_END_」を抜いたらエラーが無事全部消えました!ただプログラムの最後に書く「_END_」ていうのは抜いても問題ないのでしょうか?
KentWebさんのホームページでいくつかBBSプログラムをダウンロードして中身をみたら最後には「_END_」がついていたのですが。

あと、とりあえずCGI::Carp qw(fatalsToBrowser);というのを使ってみようと思います。
アドバイスありがとうございます。


3:[回答] Iwa [URL] [2004/02/20 00:47 ]

文法上、解釈のしようが無い単語をクォートされた文章として取り扱います。
こういったものを裸のワードといいます。
本来、__END__は以降の行をコメントとして扱うためのものです。
が、最初に__DATA__としてしまっているため、__END__もスクリプトの一部と解釈されてしまい裸のワードと判断されているのでしょう。
別に__END__はなくてよいです。
というか、__○○__は複数使えないのでこの場合(KCAtchと__DATA__を使う場合)は__END__は消さないとだめです。


4:[回答] Iwa [URL] [2004/02/20 00:52 ]

ん?
良く見たら_END_になってますね。
正しくは__END__です。
あ゛、使えないのは同じ__○○__で違えば問題なかったです。(但し、先に__END__がくると以降はコメント扱いなので無意味ですが)


5:[回答] Iwa [URL] [2004/02/20 01:11 ]

一応特殊リテラルについて解説

__LINE__ この文字そのものがある行番号を値としてもつ
__FILE__ この文字があるファイル名を値としてもつ
__END__ この文字がある場所をファイルの終わりと判断して以降は無視。但し、特殊ファイルハンドルDATAで__END__以降を読み出すことが可能
__DATA__ __END__と同じ働きをするが、DATAというファイルハンドルをカレントパッケージの名前空間にオープンする
__PACKAGE__ コンパイル時のカレントパッケージ名を持つ


6:[完了] 白くま [2004/02/20 18:51 ]

「__END__」のアンダーラインは半角が2個だったのですね。


丁寧に色々とアドバイスをくださってありがとうございました。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World