WEB相談室

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

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

0:[投稿] atusi [2002/10/12 12:32 ][環境:WIN+IE WIN系+Perl]


use strict;
を使って安全なプログラムをしようと思ったのですが、

ファイル読み込みのサブルーチン &fileRead(); を呼び出したのですが、
エラーが返ってしまいます。

エラーメッセージは以下のようですが、
このままではファイルハンドルが引数として渡せません。
これは、どうやって対処したらよいのでしょうか???

どうぞご指導のほど、よろしくお願いいたします。

# エラーメッセージ
Can't use string ("FILE") as a symbol ref while "strict refs" in use at ./subroutine.pl line 99.

# ファイルオープンのサブルーチン
# $_[0] には FILE が入っている
# $_[1] には データファイルへのパスが入っている
sub fileRead {
    
    # 変数定義
    my $FileHandle = "$_[0]";
    my $datafile = "$_[1]";
    
    # 読み込み処理
    open("$FileHandle","<$datafile") or errorPrint("can't open $datafile");
    eval{ flock("$FileHandle",1)};
    my @DATA = <$FileHandle>;
    close "$FileHandle";

    return \@DATA;

}


1:[回答] andi [2002/10/12 13:57 ]

use strict;
use Symbol qw(gensym);

my $fh = &Symbol::gensym();

open($fh,"hoge.txt");
&fileRead($fh);
close($fh);

sub fileRead{
  my $FileHandle = $_[0];
  # 以下処理
}

理由は良く知らないのですが、こんな感じで直りました。


2:[回答] 29歳からのPerl [2002/10/12 22:05 ]

Perlの言語仕様で、デバイスディスクリプタは型グロブで渡すという約束事があるからみたいです。
はじめはCと同じく構造体でできてるデータタイプだからと考えていましたが、
インタープリタならどうとでもなったと思いますから(Perlはスカラーデータも構造体みたいなもんだし)。
作者がCとの親和性を考慮し、将来にも対応できるよう決めた結果ではないでしょうか???
ボケ役なので、正確な知識をお持ちの方の説明おねがいします。

#動作保障のないソース
use strict;

*buffer = fileRead(\*FILE, 'text');
close(FILE);
print *buffer->[0];
...
...

sub fileRead {
 my ( $file, $path ) = @_;
 open($file, $path) or return undef;
 my @DATA = <$file>;

 return ( \@DATA );    # ここが、なぜ問題ないのか悩みました!
}


3:[回答] Mr.X [2002/10/12 22:42 ]

> use strict;
せっかくモジュールを使うならそのままモジュールの世界に突き進むがよろし :)

use strict;
use FileHandle;

my $fh = new FileHandle;
&foo($fh, "input.dat");

sub foo {
    my $fh = shift;
    my $path = shift;
    $fh->open($path);
    while (<$fh>) {
        print;
    }
    $fh->close;
}


4:[完了] atusi [2002/10/13 11:26 ]

皆様、本当にどうもありがとうございました。
諸知識をつけながら、モジュールを使用させて頂こうと思いました。
早速モジュールを使って書いてみます。



5:[質問] ゆぅき [2002/10/15 19:53 ]

>>2
これは間違い?
モジュール使えない場合は?
解説希望!


6:[回答] やじうま1号 [2002/10/15 21:07 ]

>>5
モジュールは使ってませんよ・・・。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World