良くあるエラーと対処方法

 perl のデバッガは、ミスを発見する有効な情報を提供してくれます。しかし、必ず的確な原因を指摘してくれるとは限りません。そこでまず、デバッガを使うコツを簡単に説明します。

【コツ1】 1行前もチェックすること。

 デバッガは、原因と思われる行を指定して報告してくれますが、場合によっては、その1行前に問題があることが多々あります。従って、指摘された行に問題がなければ、その1行前をチェックしましょう。この場合は、概ね、セミコロン抜けや、「'」「"」などの引用符抜けが考えられます。

【コツ2】 上から順に解決すること。

 一つのミスで、エラーが何行も出てくることもあります。この場合には、根本的な原因を特定するためにも、上から順に解決していきましょう。下から見ていくと、まったく問題無いにもかかわらず、エラーと指摘され、無駄な時間を過ごすことになります。

 では、よくある文法エラーの内容を紹介します。perl のデバッガが出力するエラー内容はあくまでも参考です。ここでは例を掲載しておりますが、スクリプトによっては、解決策がその限りではありませんのでご注意ください。


syntax error at E:\test.pl line 4, near "print"

【意味】

4 行目の「print」のあたりで、文法エラーがあります。

【例と解決】

概ね 1 行前を見てください。多分、セミコロンが抜けているなどの簡単なミスがあるはずです。

3: print "テスト"
4: print "テスト";

3行目の最後に「;」が抜けていますね。正しくは、

3: print "テスト";
4: print "テスト";

です。


Can't find string terminator '"' anywhere before EOF at E:\test.pl line 3.

【意味】

EOFまでの何処にも、文字列終端子「"」を見つけられませんでした。

【例と解決】

引用符が正しく閉じられていない場合に出てきます。例えば、

3: print "テスト;

です。正しくは、

3: print "テスト";

Unquoted string "hogehoge" may clash with future reserved word at E:\test.pl line 3.
Can't find string terminator '"' anywhere before EOF at E:\test.pl line 3.

【意味】

クォートされていない文字列 "hogehoge" は、3行目において、将来予約される word でクラッシュするかもしれません。EOFまでの何処にも文字列終端 「"」 を見つけられませんでした。

【例と解決】

クォートされるべき文字列の始めに引用符が抜けている場合に出てきます。例えば、

3: print hogehoge";

です。正しくは、

3: print "hogehoge";

でなければいけません。

【補足】

デバッガは、「hogehoge」という文字列を、引用符で開始されていないため、perlの予約語と認識したのですが、実際には「hogehoge」という予約語は無いため、上述のようなエラーを表示しています。そして、「hogehoge」の後ろの「"」を、引用開始と認識したため、引用終了の「"」が無いといっているのです。


Unrecognized character \x83 at E:\test.pl line 3.

【意味】

認識できない文字 \x83 です。

【例と解決】

上と同様ですが、クォートされるべき文字列の始めに引用符が抜けている場合に出てきます。例えば、

3: print テスト";

です。正しくは、

3: print "テスト";

でなければいけません。

【補足】

デバッガは、「テスト」という文字列を、引用符で開始されていないため、perlの予約語と認識したのですが、日本語だったために、「認識できない」とエラーを出力したのです。


Name "main::string" used only once: possible typo at E:\test.pl line 3.

【意味】

名前「main::string」が一度しか使われていません。

【例と解決】

これは、変数「$string」が一度しか使われていなかったことを意味します。文法的にはOKですが、正しく処理されていない場合があります。

3: $string = "テスト";
4: print "$sting";

例えば、上のスクリプトですが、本来であれば、「テスト」と出力したいにもかかわらず、実際には何も表示されません。しかし文法的にはOKですので、CGI だとすると Internal Server Error になりません。例では print で指定している「$sting」は、「$string」であるべきです。つまりスペルミスということになります。正しくは

3: $string = "テスト";
4: print "$string";

となります。

【補足】

この場合は、文法エラーではありません。-w スイッチをつけてデバッグした場合にのみ出る警告です。警告内容に「main::string」とありますが、この「main」とはパッケージ名といって、別途パッケージを作成しない限り、通常すべて「main」となります。


Unmatched right curly bracket at E:\test.pl line 8, at end of line

【意味】

右大括弧が一致しません。

【例と解決】

大括弧 } が多い場合にエラーが出ます。特に、if や while 等、大括弧で括るような場合では注意が必要です。

3: if($flag) {
4:     print "true";
5: } else {
6:     print "false";
7: }
8: }

です。8 行目の右大括弧 } が余分ですね。