perl の print文の出力が変でちょっと迷った話

スポンサーリンク
スポンサーリンク

perl で print文が意図通りに表示せず、原因がわかるまでかなり迷った話です。
ファイルのある行を変数に読み込んで print したら、表示されなかった、という内容です。

下記のようなコードを実行したら、$b の内容しか表示されませんでした。

open( IN , "test.txt" );
$a = <IN>;
$b = <IN>;
$a =~ s/\n//;
$b =~ s/\n//;
print "$a$b\n";

これ、原因は、ファイルの改行が \n では無く、\r になっていたためでした。
再現コードです。
実行すると、表示は「67890」だけになります。

$a="12345\r";
$b="67890\r";
$a =~ s/\n//;
$b =~ s/\n//;
print "$a$b\n";

原因は、\n では無く、\r が使われているためです。

\n はラインフィードで、1行送り、の意味があります。
\r はキャリッジリターンで、出力位置を左端にする意味があります。
左端に戻すだけなので、続く文字が上書きされて表示されます。

つまり、print “12345\r67890\r” は、12345 を出力して(行はそのままに)左端まで移動し、12345を上書きする形で、67890 を出力します。

ファイルを lvコマンドで見ていましたが、\r でも次の行に改行されて表示されるので、発見が遅れました。
cat なら、今回の問題同様、12345\r67890\r の場合は 67890 だけの表示なので、わかります。

コメント

  1. az5555 より:

    初めまして。面白いブログですね。よろしくお願いします。
    http://blog.livedoor.jp/az5555/

タイトルとURLをコピーしました