カスタム検索
このエントリーをはてなブックマークに追加
tomo.gif (1144 ツバツイツト)line.gif (927 ツバツイツト)line.gif (927 ツバツイツト)line.gif (927 ツバツイツト)To previous pageTo home pageMailing to me

Perlのエラーで悩む話題

Modified: 1 December 2006

単純なエラーは大抵はすぐに解決しますが、ときどき、なんでもないエラーにはまってしまい長時間悩むことがあります。
疲れているとよく起こります。そんなときには、一旦あきらめて、翌日にでも再度トライすると、すぐに解決することが多いです。


"Wide character in print at ..."のエラーで悩む (1 December 2006)

UTF-8で表示は問題ないのにファイルに書くと文字化けしてしまう (18 March 2006

"Possible unintended interpolation of ... "のエラーで悩む (23 February 2006
"Use of uninitialized value in concatenation (.) or string at ..."のエラーで悩む (1 March 2006)


"Wide character in print at ..."のエラーで悩む 

漢字をファイル出力するとこのエラーが出るようです。

ファイルを、以下のようにしてOPENすると出なくなりました。

open HTMLDATA ,"<:utf8","$templatefile" or die "Can't open $templatefile for reading.\n";

UTF-8で表示は問題ないのにファイルに書くと文字化けしてしまう 

XMLを扱うので漢字コードを含んだソースコード内をUTF-8で保存して実行しました。

UTF-8の文字コードの端末で、ソース内の漢字を表示させるとは、ちゃんと表示されましたので、それをファイルに保存しました。すると、出力された文字コードがUTF-8で文字化けします。EUCでもないShiftJISでもない、ましてJISでもない、しかもUTF-8でもない。

いろいろ施行すると、UTF-8を再度UTF-8に変換したようなコードのようです。途方にくれました。

やっとみつけました。以下のようにソースコード内で使う漢字コードを指定すればいいのでした。

use encoding "utf-8";

"Use of uninitialized value in concatenation (.) or string at ..."のエラーで悩む

以下の"print <<EOM;" の行番号でエラーが出て悩みました。

print <<EOM;
<tr valign="top">
<td width="30" align="right" background="../../img/$season/cook-l.gif" class="midium">$seqno</td>
<td background="../../img/$season/cook-r.gif" class="midium2">$howto</td>
</tr>
EOM

まず、この書き方の場合、"print <<EOM;" から"EOM"の間のどこでエラーが生じても、 "print <<EOM;" の行のエラーとなります。

エラーメッセージの意味は、「初期化されていない変数が使われています。」ということです。実は、"$seqno" を初期化せずに使っていました。

エラー行が、"print <<EOM;" の行だったので、"EOM"が悪いのか、";"が余計なのかななどと悩んでしまいました。


"Possible unintended interpolation of ... "のエラーで悩む

"@width" という変数を使ってないのに、以下のエラーが出ました。

# perl -wc privsent.cgi 
Possible unintended interpolation of @width in string at privsent.cgi line 48.
Global symbol "@width" requires explicit package name at privsent.cgi line 48.
privsent.cgi had compilation errors.
#

"@width" はともかく、"width" を調べましたら、以下のように、ぜんぜん問題が見当たりません。

print <<EOM;
      :
  <table border="0" cellpadding="5" cellspacing="1" class="base" width="100%">
      :
EOM

さらによーーーーく見ると、"width"の前に、半角スペース2つ分が空いていました。そこのスペースを1個にでもしてみようかと思って削除したとき原因が判明しました。そう全角空白が入っていました。

どうやら全角空白の後半の半角文字コードが「@」のようです。


To previous pageTo home pageMailing to meJump to Top of pageline.gif (927 ツバツイツト)line.gif (927 ツバツイツト)tomo.gif (1144 ツバツイツト)
カスタム検索



このエントリーをはてなブックマークに追加