川合孝典です。
----- Original Message -----
From: "藤岡和夫" <kazuf@...>
To: <TSperl@...>
Sent: Sunday, July 07, 2002 9:04 PM
Subject: [TSperl:108] Re: ctrl-Zを無視して読み込む
>
> On Sun, 07 Jul 2002 16:55:38 +0900
> WATANABE Hirofumi <eban@...> さんwrote:
>
> > なんか勘違いがあるようです。binmodeは
> > 入出力時に改行コードを変換しない
> > \czをEOFとみなさない
> > というモードに移行するだけです。
> > つまりUNIX上でDOSのテキストファイルを処理するのと全く同じです。
> > ですからふつうのテキストファイルも同じように処理できます。
> > これはCR+LFとLFのどちらもLFが最後にあるから可能とも言えます。
> > DOSがLF+CRとか選んでいたらちょっと面倒だった。
> >
> > 改行コードの変換が入らないためCRの処理は必要になりますが、こ
> > れは邪魔ならtr/\r//dで消すとか、出力時に必要になり足すくらい
> > ならCRはそのままで処理するとか、ま、その程度です。
>
> binmodeで読み込む場合には、閑舎さんが書かれたようなスクリプトが頭に浮
> かんでしまうのですが(255バイトずつ読むか、1024バイトずつ読むかは別にして、
> binmodeのスクリプト例には必ず書いてあるので)、テキストファイルを一行ずつ
> 読み込むという動作は変わらないのでしょうか。要は改行で区切ってあるものを
> 行と呼ぶわけですけど。
そう思ってサンプル出したんですけど、あれではダメですか?
実際に確かめてみるのが一番の早道だと思いますけど、
このスクプリプトではいかがでしょうか?
全体を読み込んでいるようには私は思っていませんけど。
[スクリプト]
open OUT, '>kaba.txt';
binmode OUT;
print OUT <<EOD;
kaba1\x1A
kaba2\x1A
kaba3\x1A
EOD
close OUT;
print "\n----TEST1----\n";
open IN1, '<kaba.txt';
while(<IN1>) {
print scalar(localtime), $_;
}
close IN1;
print "\n----TEST2----\n";
open IN2, '<kaba.txt';
binmode IN2;
while(<IN2>) {
print scalar(localtime), $_;
}
close IN2;
[実行結果]
----TEST1----
Sun Jul 7 22:53:34 2002kaba1
----TEST2----
Sun Jul 7 22:53:34 2002kaba1^Z
Sun Jul 7 22:53:34 2002kaba2^Z
Sun Jul 7 22:53:34 2002kaba3^Z
ついでに
while(<IN2>) {
chomp;
print scalar(localtime), $_, ":";
}
とchompを入れれば改行もきれいにはずせると思います。
===================================================
川合 孝典 (Hippo2000)
DBI日本語メーリングリスト管理人、Kansai.pm所属
kwitknr@... GCD00051@...
http://member.nifty.ne.jp/hippo2000、http://www.hippo2000.info/
「MySQL&Perl Webアプリケーション開発」の発売中
http://member.nifty.ne.jp/hippo2000/mysqlperl.htm
===================================================