プロが教えるわが家の防犯対策術!

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行目しか
読み込まれていないんですか?

高速処理とメモリ節約を気にして質問しました。

A 回答 (3件)

>flock(OUT, 2);


お使いのOSはWindows98系ですか?

Windows98系であれば、flockそのものが使えません。
(flock関数そのものが実装されていない、エラーメッセージでimplements関係のメッセージが出ていればそうです)

Windows系で確かめるのであれば、WordかExcelで読みこみファイル
“a.dat”を開いておくのが良いです。

あと、読み込み始めると言っても、システムによってロックされているので
データをガシガシ読めるわけではなく(それじゃOSが機能してないですね)
1行目の1文字目でEOFが返ります。(少なくとも普通のOSならそうなるはずです)
(ファイルは普通はOSが守ってくれます)

あとはご自分で調べてください。
    • good
    • 0
この回答へのお礼

どうもおかしいと思ったら、Win98 では
flock が使えなかったんですね。
実際にアップして実験したら、2つのコメントを
外して、ロックしているのに読み込める
というのを確かめることができました。

flock というのはロックのフラグのようなもので
それだけではファイルはロックされない。
ファイルに触れさせないためのロックの
処理については、flock でのフラグの値によって
場合分けをし、ロックされていればファイルに
触れさせない処理を書く
という方法で本当のロックが実現できるわけですね。

ありがとうございました。
たくさん勉強になりました。

お礼日時:2001/09/26 12:52

>open(IN, "a.dat");


>↑この1行が実行された時点で、a.dat のデータの全てが
>読み込まれてしまうんですか?
いいえ、読み込まれません。
デフォルトでは、(例えば
open(STDOUT , "display");
というような意味合いにしているのと同様です。
大体2つのことをしており、
ひとつは“ファイル名”にファイルハンドルを結びつけること、
もうひとつは、ファイルがオープンできるかどうかをチェックすること。
(ただし、チェックするだけで、制御してくれるわけではないことが注意点です。
 自分でエラー処理をしないと、次の< >でシステムにロックされているような
 ファイルでも平気で読み込みを始めます。open関数は「偽」を返すという
 だけで処理が止まるわけではない点が注意点です)


実際に「ファイルにアクセスしてデータを読み込んでいるのは、< >演算子」です。
< >演算子は、スカラーコンテキスト(この場合、=の左辺が$~)であれば、
“一行分だけ「ファイル」からデータを読み込みます”

又、< >演算子は、リストコンテキスト(この場合、=の左辺が@~)であれば、
“「ファイル」全部の行を一気に読み込みます”
〔但し(<IN>)[0..9]というようにスライスしといてメモリを節約することは可能〕

ただし、「$系の一行処理=低速・メモリ節約」であり「@系の一括処理=高速・メモリ消費」です。

(でもはっきり言えば、扱うのが、とんでもないでかい動画
 とかでもないかぎり、一括で読み込んだほうが、大抵いいですよ。
 少なくともBBS程度の1M以下のテキストだったら、
 一括で呼んだほうが賢いです。
(メモリの方は今や128M~256Mは搭載されているわけですから。。。)
 

この回答への補足

ありがとうございます。
スライスの使い方は知らなかったのでうれしかったです。

ロックされているようなファイルでも
平気で読み込みを始める
というのが気になりました。

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 自体がよく分かっていないんです。
これがきちんと書けていたら、ロックされているのに
読み込みができるというのを確認することができると
思いました。
ソースのどこを直せばいいんですか?

補足日時:2001/09/26 08:10
    • good
    • 0

perl のソースを読んだこと無いですがおそらく、



$xx = <IN>;

でファイルポインタのある行を $xx に代入して次の行の先頭にポインタを持っていくと思います。

なので、open() の時はただ単にファイルのオープンだけだと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/09/26 08:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!