OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

open( ) の読み込み量

  • 暇なときにでも
  • 質問No.140020
  • 閲覧数60
  • ありがとう数2
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 59% (194/328)

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

高速処理とメモリ節約を気にして質問しました。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.3
レベル11

ベストアンサー率 61% (157/255)

>flock(OUT, 2);
お使いのOSはWindows98系ですか?

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

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

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

あとはご自分で調べてください。
お礼コメント
A__

お礼率 59% (194/328)

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

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

ありがとうございました。
たくさん勉強になりました。
投稿日時 - 2001-09-26 12:52:05
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル7

ベストアンサー率 68% (13/19)

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

$xx = <IN>;

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

なので、open() の時はただ単にファイルのオープンだけだと思います。
お礼コメント
A__

お礼率 59% (194/328)

ありがとうございます。
open( ) の時点では、まだ読み込みは
されないんですね。
投稿日時 - 2001-09-26 08:10:25


  • 回答No.2
レベル11

ベストアンサー率 61% (157/255)

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


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

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

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

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

お礼率 59% (194/328)

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

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

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:37
このQ&Aで解決しましたか?
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ