WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:perlのファイルハンドラについて

0:[投稿] my [2004/01/13 17:34 ][環境:ie perl]

perlでファイルを開く際、

open FILE "test_file";

としているのですが、ファイルハンドラの FILE がグローバルな
変数のようになってしまっていて、他の関数からでもFILEが使えて
しまい、困っています。

my FILE

としてもやはり無理ですし、どうにかmy的な動きをさせることは
出来ますでしょうか?


1:[回答] kak [2004/01/13 17:50 ]

ども。

ファイルハンドルのスコープって聞いたことないですね。

普通(私にとっての普通かもしれませんが)、ハンドル名を
変えて使用するので困ったことはないです。

PG中に複数ファイルを開いたりする時は分かりやすいように
ハンドル名を変えることをお勧めしますよ。

でわ。


2:[回答] kak [2004/01/13 18:00 ]

ども。

追加で。。。

ファイルハンドルのスコープがグローバルだからである。変数名の重複はmyを使えば回避できるが、ファイルハンドルは、それができないので、サブルーチンで書類を開けば、非常に複雑なバグが生じ得る。


とあるサイトで書かれていました。


詳しくはここで、、、

http://hp.vector.co.jp/authors/VA026513/WayToPerl_Html/documents/07_00MarkingLanguagePerl.html


やはり、ファイルハンドル名はユニークになるようにした方がよいようですね。


でわ。


3:[回答] my [2004/01/13 18:01 ]

ありがとうございます。

私もハンドル名は変えて行っていたのですが、処理区分ごとに
細かく関数化していくと、ファイルを開く関数を何度も使用す
ることがあります。そうすると、同じハンドル名を何度も使用
していくことになり、mod_perlや、後ろで処理を走らせていた
りした場合に不具合が出てしまいました。

この場合はファイルハンドル名を動的に変更する手法を思いつき、
解決できたのですが、恒久的な解決法としてファイルハンドラを
レキシカルに出来るといいなと考えています。

やはり無理なのでしょうか?


4:[回答] ミツ [2004/01/13 19:46 ]

試してないし、よくわかってないけど
「ファイルハンドルをオブジェクトとして扱うこともできます」
だ、そうです。

http://www.rfs.co.jp/sitebuilder/perl/02/08.html#TRY!%20ファイルハンドルを変数に格納する
オブジェクトならスコープを制御することもできるかもしれませんね。


5:[回答] ふじ [2004/01/14 03:06 ]

Perl 5.6 以降なら

{
   my $fh;
   open $fh, "< somefile";
   while(<$fh>){
       print:
   }
   close $fh;
}

みたいにできます。$fh は my 宣言してあるので、スコープの外からは見えません。

型グロブで、
{
   my $fh = *IN;
   open $fh, "< somefile";
}
としても、スコープの外から IN で見えてしまいますね。

Perl 5.004 〜 5.005 でも、標準モジュールである IO::File を使って

use IO::File;
{
   my $fh = IO::File->new('somefile', 'r');
   $fh->close;  # 明示的に close しなくてもスコープからはずれる時に自動的に close される
}

のように書けます。

5.003 以前は手元に環境がないので分かりません。
# perl5_003.tar.gz を入手してビルドしてみたけど途中でこけたので、追う気なし。


6:[回答] ふじ [2004/01/14 03:11 ]

追記ですが、私は移植性 (まだまだ 5.005 + mod_perl の環境も稼働しているので)
を考えて、IO::File を使うのが好みです。

mod_perl 環境だとファイルの閉じわすれが致命傷になることもあるので、
スコープからはずれた時に勝手に close してくれる IO::File は重宝します。


7:[回答] my [2004/01/14 11:23 ]

>>4
>>5
>>6
ありがとうございます。
IO::Fileですか。こういうのがあるとは知りませんでした。
便利ですね。

レキシカルなオブジェクトの{IO}のファイルハンドラを利用しているからレキシ
カルになるんでしょうか?
とりあえず、今回はこれを利用して、のちのちロジックを勉強したいと思います。
有り難うございました。


8:[回答] B-Cus [2004/01/14 15:45 ]

local(*FILE);
open FILE "test_file";

でも実現できたような気がするようなしないような。
できなかったら失礼。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World