Perlでのファイルハンドルの取り扱いについて質問です。サブ関数でオープンしたファイルのハンドルを返したいです。型グロブを使えばいいのかと{ local *FH ; open FH,$file ; *FH ;}などとしてみましたが、毎回同じ値が返ってきます。C言語などではファイルハンドルの値はユニークだと思うのですが、どうなっているのでしょうか?さっぱりわかりません。どうしたらいいか教えて下さい。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答8件)

id:masi No.1

回答回数356ベストアンサー獲得回数0

ポイント20pt

ファイルハンドルを変数に格納するには、

$fh = *FILEHANDLE;

サブルーチンに渡すには、

&function(*FILEHANDLE);

id:osietekun

この時別々のファイルを開いているのに$fhに入ってる値が一緒なんで困ってるんです。

自分がなにか勘違いしているのでしょうか?

2003/11/05 21:40:58
id:uwi No.2

回答回数5ベストアンサー獲得回数0

ポイント20pt

このPerl&CGI講座の

!%20ファイルハンドルを変数に格納する

ここに書いてある通りだと思います。

id:osietekun

先ほどの質問と一緒です。

2003/11/05 21:42:22
id:tarchan No.3

回答回数200ベストアンサー獲得回数2

ポイント10pt

http://www.perl.com/

Perl.com Home Page

同時にファイルを開いているのでなければ、同じあたいになることもあると思います。ファイルハンドルはファイルを直接表すURLなどの表現と違って、開いているファイルの内部的な表現です。

内容を読み込んでみて、すべて同じ値になるのなら、openの指定の段階で間違っているのではないでしょうか?

id:osietekun

>ファイルの内部的な表現です。

それはよくわかってます。

間違ってるようには思えないんですけれど。。

2003/11/05 22:22:00
id:GEAR No.4

回答回数33ベストアンサー獲得回数0

ポイント20pt

FileHandleモジュール使ってみては。

my $fh = new Filehandle;

$fh->open(”>>ファイル名”);

などなど

OOPの知識がほんの少し必要になりますが。

FileHandleモジュールは最近のPerlなら標準で付属しています。

id:osietekun

ん〜、やはりこれを使うことになるんですかねー。

2003/11/05 22:24:40
id:masi No.5

回答回数356ベストアンサー獲得回数0

@fh=<FH>;

<>をつけてもだめですか?

id:osietekun

それやると、読み込まれたものがかえってきますよね?

というか逆に自分が教えてる気がするのは気のせいでしょうか?

2003/11/05 22:26:15
id:asakura-t No.6

回答回数151ベストアンサー獲得回数2

Perlのバージョンが書かれていませんが、

sub {

open my $fh, ”$infile”;

return $fh;

}

とかで良いのでは?

 あとはGENSYMを使う方法もあります。

id:osietekun

今出先なんで正確にはわかりませんが、4年前のPerl4.xくらいだと思います。

おそらくこの書式は5.6辺りくらいからしかできないかと思います。

GENSYM、、ん〜〜、明日時間あったら調べてみます。

2003/11/06 00:08:13
id:asakura-t No.7

回答回数151ベストアンサー獲得回数2

ポイント20pt

というわけでgensymを使ったバージョン。

use Symbol;

sub foo {

my $fh = gensym;

open $fh, ”$infile”;

return $fh;

}

かな?

id:osietekun

後で試します。

2003/11/06 11:11:59
id:mahbo No.8

回答回数87ベストアンサー獲得回数0

ポイント20pt

上記の一番下には同じ事が載っていますので、考え方は正しいという気がしますが、IO::Handleモジュールを使う方が良いかも知れませんね。

id:osietekun

モジュールのインストールは避けたかったんですが、現状それしかなさげ

2003/11/07 00:17:50
  • id:asakura-t
    Perl4なら

    例えば、

    sub foo {
    local $fh = rand;
    open $fh, ”$infile”;
    return $fh;
    }

    でも大丈夫かも。
    (手元にPerl4がないので確認できないけど、Perl5では大丈夫)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません