作者: KAWAI,Takanori
日時: 2002/7/7(23:00)
川合孝典です。

----- 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
===================================================