• ベストアンサー

open( ) の読み込み量

open(IN, "a.dat"); $xx = <IN>; これで a.dat の1行目が $xx に代入されます。 open(IN, "a.dat"); ↑この1行が実行された時点で、a.dat のデータの全てが 読み込まれてしまうんですか? それとも、 open(IN, "a.dat"); $xx = <IN>; が実行された時点では a.dat のデータの1行目しか 読み込まれていないんですか? 高速処理とメモリ節約を気にして質問しました。

質問者が選んだベストアンサー

  • ベストアンサー
  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.3

>flock(OUT, 2); お使いのOSはWindows98系ですか? Windows98系であれば、flockそのものが使えません。 (flock関数そのものが実装されていない、エラーメッセージでimplements関係のメッセージが出ていればそうです) Windows系で確かめるのであれば、WordかExcelで読みこみファイル “a.dat”を開いておくのが良いです。 あと、読み込み始めると言っても、システムによってロックされているので データをガシガシ読めるわけではなく(それじゃOSが機能してないですね) 1行目の1文字目でEOFが返ります。(少なくとも普通のOSならそうなるはずです) (ファイルは普通はOSが守ってくれます) あとはご自分で調べてください。

A__
質問者

お礼

どうもおかしいと思ったら、Win98 では flock が使えなかったんですね。 実際にアップして実験したら、2つのコメントを 外して、ロックしているのに読み込める というのを確かめることができました。 flock というのはロックのフラグのようなもので それだけではファイルはロックされない。 ファイルに触れさせないためのロックの 処理については、flock でのフラグの値によって 場合分けをし、ロックされていればファイルに 触れさせない処理を書く という方法で本当のロックが実現できるわけですね。 ありがとうございました。 たくさん勉強になりました。

その他の回答 (2)

  • kokucho81
  • ベストアンサー率61% (157/255)
回答No.2

>open(IN, "a.dat"); >↑この1行が実行された時点で、a.dat のデータの全てが >読み込まれてしまうんですか? いいえ、読み込まれません。 デフォルトでは、(例えば open(STDOUT , "display"); というような意味合いにしているのと同様です。 大体2つのことをしており、 ひとつは“ファイル名”にファイルハンドルを結びつけること、 もうひとつは、ファイルがオープンできるかどうかをチェックすること。 (ただし、チェックするだけで、制御してくれるわけではないことが注意点です。  自分でエラー処理をしないと、次の< >でシステムにロックされているような  ファイルでも平気で読み込みを始めます。open関数は「偽」を返すという  だけで処理が止まるわけではない点が注意点です) 実際に「ファイルにアクセスしてデータを読み込んでいるのは、< >演算子」です。 < >演算子は、スカラーコンテキスト(この場合、=の左辺が$~)であれば、 “一行分だけ「ファイル」からデータを読み込みます” 又、< >演算子は、リストコンテキスト(この場合、=の左辺が@~)であれば、 “「ファイル」全部の行を一気に読み込みます” 〔但し(<IN>)[0..9]というようにスライスしといてメモリを節約することは可能〕 ただし、「$系の一行処理=低速・メモリ節約」であり「@系の一括処理=高速・メモリ消費」です。 (でもはっきり言えば、扱うのが、とんでもないでかい動画  とかでもないかぎり、一括で読み込んだほうが、大抵いいですよ。  少なくともBBS程度の1M以下のテキストだったら、  一括で呼んだほうが賢いです。 (メモリの方は今や128M~256Mは搭載されているわけですから。。。)  

A__
質問者

補足

ありがとうございます。 スライスの使い方は知らなかったのでうれしかったです。 ロックされているようなファイルでも 平気で読み込みを始める というのが気になりました。 open(OUT,"a.dat"); #flock(OUT, 2); open(IN,"a.dat"); print $hajime = <IN>; #a.dat の1行を表示 close(IN); #flock(OUT, 8); close(OUT); ↑のソースで実験してみようと思ったけど、 2つの # を消すと、close(OUT); 以降の処理が あった場合、その処理がされないからスクリプトエラー になっているんだと思いました。 flock 自体がよく分かっていないんです。 これがきちんと書けていたら、ロックされているのに 読み込みができるというのを確認することができると 思いました。 ソースのどこを直せばいいんですか?

  • tujige
  • ベストアンサー率68% (13/19)
回答No.1

perl のソースを読んだこと無いですがおそらく、 $xx = <IN>; でファイルポインタのある行を $xx に代入して次の行の先頭にポインタを持っていくと思います。 なので、open() の時はただ単にファイルのオープンだけだと思います。

A__
質問者

お礼

ありがとうございます。 open( ) の時点では、まだ読み込みは されないんですね。

関連するQ&A