【Perlでエラーチェックポイント】Perlの実行時にエラーが出た時にまずは確認しておきたいポイント


PC/プログラム/ゲーム/ネット系レポ TOPはこちら

Perlの実行時にエラーが出たときのあるあるチェックポイント

Perlはどこでエラーが起きているかわかりにくい時があります。

・・・と、いう訳で、とりあえずありがちなミスを自分の経験からまとめてみました。

 

エラーのチェックポイントをメモしましたのでご紹介します。

 


変数名に$を付け忘れている

あるあるです。


if で { } の付け忘れ

特に、他の言語と違って、一行で完結するif 文でも if (xxx==0) { 〜;  }

のように必要なので、付け忘れないようにしましょう。


( ) の対応がとれていない

括弧の対応がとれていないと、エラーが起きます。

よーく見て、if 文などで、どちらかの括弧が多い・・・かもしれません。


; セミコロン忘れ

行末に ; をつけ忘れている。


注釈を // とかにしている

あるある。 /*  */ としてしまうことも。

Perlの注釈は # です。


"〜" と '〜' の動きの違いを間違っている

"\n" だと改行文字だけども、 '\n' とすると、そのまま \n で出力されてしまいます。

エスケープ文字などを使用する場合は、"〜" を使います。

"〜" の中で、" を使用したいときは、 \" とします。

"〜" の中に " がある。\" にし忘れている

これも、いきなりプログラムが実行できないエラー(500)が出るときの、あるあるです。

HTML関係のコードをPRINT "〜〜〜"; の形式で記述するとよく発生します。

\"にするのが面倒な場合は、シングルコーテーション ' ' で囲む方が楽です。

print '<table border="1" cellspacing="0" cellpadding="5" width="590" bgcolor="#FFFEDD" >';

でも、変数展開やエスケープシーケンスは ' ' で囲むとできません。HTMLの場合は " " でくくらなくても動作してしまいます。そ

のため、

print "<table border=1 cellspacing=0 cellpadding=5 width=590 bgcolor=#FFFEDD >\n";

みたいにいっそのこと "" を抜いてしまうというのも手です。

変数展開に失敗していた

"〜" で囲んで変数を中に入れる、変数展開時に間違って認識されてしまうことがあります。

そんなときは、$変数名 を ${変数名}  と記載して、明確にすることで間違って認識されることがなくなります。

 


スペースだと思ったら全角漢字の空白(" ")だった、全角のセミコロン(;)だった

これも結構あるあるです。

全角スペースが見えるエデッタの使用や、全角スペースで検索するなどして、チェックしてみてください。


サーバ上の属性変更(実行属性の変更)を忘れていた

サーバで実行属性に変更し忘れていることあるあるです。

CGIは、実行できるようにパーミッションを 705 や 707 に変更する必要があるのですが、それを忘れると実行できません。利用しているレンタルサーバによって、パーミッションに指定があるので、確認しましょう。

拡張子の指定があるときは、その拡張子にしておきます。たとえば .cgi にするなどです。


FTP「バイナリーモード」で転送していた

cgiプログラムをFTPで「バイナリーモード」で転送すると実行できない場合があります。

(さくらインターネットなど)

その場合、「アスキーモード」にして転送します。

FFFTPでは、拡張子ごとに転送モードを設定する機能などもあります。


perl のパスが間違っていた

テストしている環境と、実際のサーバで、perlのパスが違う時は、修正しておきましょう。


漢字・2バイト文字が化ける(表示→侮ヲ)

実行時エラーではないですが、文字が化けるときがあります。

特に「表示」という文字。「侮ヲ」になってしまいます。(ヲは半角)

print "表示";  → 「侮ヲ」

こんな時は

print "表\示";  → 「表示」

print '表示";  → 「表示」

として対処します。

また、文字列を大文字にする関数もありますが、日本語処理に対応していない通常の uc(); などを使用すると、漢字が化けます。

日本語が正しく検索されない

$temp_string の文字中に、$temp_keyword の文字を含んでいたら・・・

if ( $temp_string =~ /$temp_keyword/ ) {   }

・・・という処理を実行しようとしても、$temp_keyword に SHIFT-JISの"ー" (のばす文字)や "表" や "暴" の文字が入ると、文字列処理がうまくいかない。

そんな時は、内部変数に変換して、

use Encode 'decode';
$temp_string = decode ('Shift_JIS' , $temp_string ); # 内部変数に変換
$temp_keyword = decode ('Shift_JIS' , $temp_keyword ); # 内部変数に変換
if ( $temp_string =~ /$temp_keyword/ ) {・・・}

とするとよい。ページの文字コードをSHIFT-JISに設定している場合など、表示するときにSHIFT-JIS に戻す必要があるときは、

$temp_string = encode ('Shift_JIS' , $temp_string );
$temp_keyword = encode ('Shift_JIS' , $temp_keyword );
print "$temp_string\n";
print "$temp_keyword \n"; 

とする。

漢字が化ける、生成したWebページがprintで表示されない

HTMLを生成するときに、「Content-Type: text/html; charset=Shift_JIS';」を出力し忘れるとページが表示されない。

print 'Content-Type: text/html; charset=Shift_JIS';
print "\n\n";
print "<html>\n";
print "<head>\n";

という感じで出力を忘れないように。(漢字コードの指定も間違えると化け化けるのでご注意を)


※ここから先は広告です。もし、ご興味があればご参照してください。

東京ディズニーランドへ行く場合は、高速バスで価格を抑えつつも、ホテル付きでゆったりすごせるプランが結構人気です。

高速・夜行バス予約サイト WILLER TRAVEL これも一度チェックしてみる価値ありです・・・

<リンク集>ビジネスホテルなどが安く予約できるサイトへのリンク集