Perl/ActivePerl For UNIX/Linux/Windows
 
TryThe Homepage
初めてのCGI
CGI 研究室
ダイナミックCGI
ダウンロード
サービス
サーバ構築(Windows)
データベースアクセス
有料サービス
FAQ
お問い合わせ
このページを印刷
Perlの罠

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.
More information about this error may be available in the server error log.

Apache/1.3.23 Server at tryhp.jpn.ph Port 80
もっとも嫌なメッセージですね。本章では、perlプログラマがよく犯してしまうミスを紹介します。
  • 末尾のセミコロン「;」を忘れる
    perlの実行分の後ろには必ずセミコロンを置かなくてはなりません。
    ○ print "こんにちは";
    BASICなど、一部の言語では改行をターミネータ「ここで終わりです」として判断しますが、 perlではセミコロンを置く事でターミネーターとします。
    逆に必要の無いところにセミコロンを置いてしまうミスもよく侵します。
    × foreach $line (@DATA) {;
    ループ構造や、if文のブロックの最後には必要ありません。

  • ブレース{ }が対応していない
    ブロックや、ループ構造では必ず1対のブレースで括られている必要があります。 ループの中に入れ子のループや、多くの条件判断ブロックがある場合は、 対応するブレースがわからなくなってしまいがちです。 できるだけインデントを使用して読み易い文を書くよう心がけましょう。
    foreach $line (@DATA) {
      for ($i = 0; $i <= 9; $i++) {
        ・・・・・・
        if ($flag) {
          ・・・・・・
        } else {
          ・・・・・・
        }
      }
    }
    このように書くだけでどの { が、どの } に対応するかが一目でわかります。

  • do{ }ブロック内でループ制御コマンドを使う
    一見foreachやwhileのようなループ構造に見え、働きもしますが、 do文はif文と同じ制御構造ですのでループ制御コマンドを使用することはできません。 必ず最後の条件判断(while, until)で脱出できるようプログラムする事が必要です。

  • ユーザ関数内でグローバル変数を使う
    perlではlocalキーワードを指定したものだけをローカル変数として重複が許されます。 localまたは、myを指定しないでメインルーチンで使用されている変数を変更すると当然メインルーチンの変数の内容が変わってしまいます。

  • 正規表現で=~に=を使ってしまう
    $value =~ /Pattern/;は、$valueを評価しますが、$value = /Pattern/;は$_を評価して結果を$valueに返してしまい結果は大違いです。

  • 配列は0から始まる
    配列変数の添え字だけでなく、substrやindex関数のオフセットも0から始まります。 気をつける必要があるのは、配列変数をスカラで評価して現在の配列変数の要素数を取得すると、 使用されている要素の最大値ではなく、要素の個数だということです。
    $DATA[0] = '梨花ちゃん';
    $DATA[1] = '綾乃ちゃん';
    $DATA[2] = '美由紀ちゃん';
    $DATA[3] = '保奈美ちゃん';
    $count = @DATA;
    このとき、$countには4が格納されますが、使用できる添え字は0から3までになります。

  • elsifをelseifと書いてしまう
    多くの言語が
    if (flag == 1) {
      ・・・・・・・・・・
    } else if (flag == 2) {
      ・・・・・・・・・・
    }
    と書くのに対しperlでは、
    if ($flag == 1) {
      ・・・・・・・・・・
    } elsif ($flag == 2) {
      ・・・・・・・・・・
    }
    と書かなくてはなりません。

  • ダブルクォーテーション内の@は無条件に展開される
    perl4では、$mail = "terra@xx.xxxxxx.or.jp";と書いても問題なく動作しましたが、 perl5からは@を配列として展開しようとするためエラーになってしまいます。@の前に\を付けて
    $mail = "terra\@xx.xxxxxx.or.jp";と書くか、シングルクォーテーションを使って
    $mail = 'terra@xx.xxxxxx.or.jp';と書きます。
Copyright 2004 Terra. All rights reserved. No reproduction or republication without written