改行コードについて
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;
実行結果は
"\x0D" Match
"\x0A" No match
と表示されます。
これは何をしているのかというと、chomp関数で削除される改行コードを調べています。
16進コード 「\x41」というのは「A」です。
なので、特殊変数「$_」には…。
ウィンドウズのテキストファイルに「A」と入力した後、改行したという様子を16進で表した値を格納しています。
そしてその特殊変数「$_」にchomp関数を当てた後、 パターンマッチ と if文 でウィンドウズ系の改行コード「\x0D\x0A」が削除されたか調べています。
結果は見てわかるように、UNIX系の改行コードである「\x0A」のみ削除されただけで、「\x0D」は残ってしまいました。
これでは困りますよね。
ちなみに、上記サンプルプログラムはUNIX系のサーバーで動作させています。
なのでこの場合、改行=\n=\x0Aとなっていることがわかります。
これらのことがわかっていてchomp関数を使うならよいですが、そうでないのであれば前述のように16進数を使ったほうが確実です。