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 だけの表示なので、わかります。
コメント
初めまして。面白いブログですね。よろしくお願いします。
http://blog.livedoor.jp/az5555/