改行コードについて

Perl/CGIプログラム 改行コード を処理していく方法について説明します。

Perl/CGIプログラム 上では通常改行は「\n」で表記します。

しかし、これはあくまでもPerl/CGIプログラム上で定義されたコード表現に過ぎません。

パソコンのオペレーティングシステム(OS)には大きく分けて、UNIX系、Macintosh系とWindows系の3種類あります。

この3種類のオペレーティングシステムはそれぞれ改行コードが異なります。

  • UNIX系OSは「LF」。
  • Macintosh系OSは「CR」。
  • Windows系OSは「CR+LF」。

ちなみに…。

「LF」とは「Line Feed」。
「CR」とは「Carriage Return」。

Perl/CGIプログラムには「\r」という別の改行コード表現もあります。

なので、これらオペレーティングシステムの違いによる改行コードの違いは、「\n」と「\r」を駆使すれば何とかなりそうですが…。

実はそんなに簡単な話ではありません。

なぜなら、「\n」で定義される実際の改行コードというのは、 Perlパッケージ が動作している環境により変化することがあるからです。

したがって、安易に「\n」や「\r」を使うのではなく、実際の改行コードを表す 16進数 を使ったほうがよいでしょう。

各オペレーティングシステムで改行を表している16進コードは以下のようになっています。

  • UNIX系では「\x0A」。
  • Macintosh系では「\x0D」。
  • Windows系では「\x0D\x0A」。

改行コードの統一

Perl/CGIプログラムで改行コードを統一するには以下のように記述します。

「s/\x0D\x0A|\x0D|\x0A/\n/;」

置換演算子 では左から評価されるので、順番は「\x0D\x0A」を必ず最初に持ってくるのがポイントです。

改行コードの削除

Perl/CGIプログラムで改行コードを削除するには以下のように記述します。

「s/\x0D\x0A|\x0D|\x0A//;」

または、「tr/\x0D\x0A//d;」でも改行を削除できます。

実はここまでであれば、 Perl/CGIプログラミング学習のファイル処理 のところで説明済みです。

ここからはその続きになります。

chomp関数

Perl/CGIプログラムには、行末の改行コードを削除するchomp関数というのがあります。

しかし、このchomp関数もPerlパッケージが定義している改行コードを削除するのみなので注意しましょう。

#!/usr/bin/perl

$_ = "\x41\x0D\x0A";

chomp;

print "Content-type: text/html\n\n";
if (/\x0D/) {
print "\"\\x0D\" Match<br>\n";
} else {
print "\"\\x0D\" No match<br>\n";
}
if (/\x0A/) {
print "\"\\x0A\" Match<br>\n";
} else {
print "\"\\x0A\" No match<br>\n";
}
exit;

Perl/CGIプログラムサンプルはこちら

実行結果は

"\x0D" Match
"\x0A" No match

と表示されます。

これは何をしているのかというと、chomp関数で削除される改行コードを調べています。

16進コード 「\x41」というのは「A」です。

なので、特殊変数「$_」には…。

ウィンドウズのテキストファイルに「A」と入力した後、改行したという様子を16進で表した値を格納しています。

そしてその特殊変数「$_」にchomp関数を当てた後、 パターンマッチ if文 でウィンドウズ系の改行コード「\x0D\x0A」が削除されたか調べています。

結果は見てわかるように、UNIX系の改行コードである「\x0A」のみ削除されただけで、「\x0D」は残ってしまいました。

これでは困りますよね。

ちなみに、上記サンプルプログラムはUNIX系のサーバーで動作させています。

なのでこの場合、改行=\n=\x0Aとなっていることがわかります。

これらのことがわかっていてchomp関数を使うならよいですが、そうでないのであれば前述のように16進数を使ったほうが確実です。