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

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

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


open( IN , "test.txt" );
$a = ;
$b = ;
$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 だけの表示なので、わかります。




ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック