トップ > Perl Tips > エラーになる例(1)(日本語の扱い方)


 ■ エラーになる例(1)(日本語の扱い方)

Prev:エラーの見つけ方

Perlで日本語を扱う場合、知っておかないとエラーになってしまうことがいくつかあります。
今回はそういったことのうちいくつかを取り上げます。

  1. 文字コード
    代表的な文字コードには「EUC」「Shift JIS」「JIS」「Unicode」
    などがありますが、一般にPerlで使われるのは、EUCやShift JISです。

    EUCはUNIXで使われるので、Perlでは文字コードに関連したエラーは出にくいです。

    しかしWindowsではShift JISが使われ、付属のメモ帳ではShift JISしか扱えません。
    こうなると、Shift JISでスクリプトを書くことが多いため、さまざまなエラーが出てしまうのです。

    よくあるエラーは、文字化けです。
    そのまま動くことが多いためエラーに気づかないことがあります。
    関連リンク:文字化けについて
  2. シングルクォート、ダブルクォートの使い方
    日本語を含む文字列をprintで出力する場合、シングルクォート(' ')、
    ダブルクォート(" ")で囲むのは当たり前のことですが、
    ほかに気をつける点があります。
    1. シングルクォートの中でシングルクォート文字を使用する場合、または、ダブルクォートの中でダブルクォート文字を使う場合
      すなわちこういうことです。
      print 'これは'メールマガジン'です'; # 「これは'メールマガジン'です」と表示するつもり
      print "これは"メールマガジン"です"; # 「これは"メールマガジン"です」と表示するつもり
      上の2つは誤りです。
      頭から見るとわかりますが、いずれも「これは」と「です」が囲まれていて、
      「メールマガジン」が囲まれていないことになります。

      こういう場合は囲まれている中のシングル・ダブルクォートの前に\をつければいいです。
      (例)
      print 'これは\'メールマガジン\'です';
      print "これは\"メールマガジン\"です";

      また、シングルクォートを含む文字列をダブルクォートで囲む、
      ダブルクォートを含む文字列をシングルクォートで囲むこともできます。
      (例)
      print "これは'メールマガジン'です";
      print 'これは"メールマガジン"です';

      上記の作業を簡単にする方法もあります。
      print qq|これは"メールマガジン"です|;
      print q|これは'メールマガジン'です|;
      qq||は" "と同じです。
      q||は' 'と同じです。
      もし、文中で|を使う場合は{}や[]などで囲ってもかまいません。
    2. 各種変数を使う場合
      たとえばこんなスクリプトではどうなるでしょうか。
      #!/usr/bin/perl

      $site = "簡単CGI";
      print "私のウェブサイトは$siteです"."\n";
      print '私のウェブサイトは$siteです'."\n";
      <実行結果>
      私のウェブサイトは簡単CGIです
      私のウェブサイトは$siteです

      ダブルクォートで囲った変数は展開されますが、シングルクォートで囲った変数は展開されません。
      スカラー変数だけではなく、配列変数、ハッシュ変数でも同様です。


      よくエラーが起こるのは、メールアドレスを変数に代入したときです。
      下の2つの例をご覧ください。
      #!/usr/bin/perl

      $mail1 = "xxx@yyy.com";
      print $mail1;


      #!/usr/bin/perl

      $mail2 = 'xxx@yyy.com';
      print $mail2;


      下の例ではエラーになりませんが、上の例ではエラーになってしまいます。
      先ほど申したように、上の例ではダブルクォートが使われているため、
      @yyyという配列変数を変数展開しようするが、ないためエラーとなります。
      下の例ではシングルクォートなので展開されないためエラーにならず、メールアドレスが表示されます。

Next:エラーになる例(2)(パーミッション)




トラックバック

このエントリーのトラックバックURL:
http://easycgi.xrea.jp/mt-tb.cgi/59