ファイルハンドルを変数に格納するには、型グロブ( * ) を使う。 open( FILEHANDLE, "$file_name"); &function(*FILEHANDLE); # 型グロブを使ってサブルーチンに渡す sub function { my ($fh ) = $_; <$fh>; print $fh "output\n"; } ★型グロブサンプル  http://chaichan.web.infoseek.co.jp/perlnote/perlnote2007-05-303.htm @a=(1,2,3); @b=(4,5,6); print "\@a=@a \@b=@b\n"; func1(\@a,\@b); print "\@a=@a \@b=@b\n"; func2(*a,*b); print "\@a=@a \@b=@b\n"; # リファレンス sub func1 { ($ref_a,$ref_b)=@_; foreach ( @$ref_a ){ $_++ } foreach ( 0..$#{$ref_b} ){ $$ref_b[$_]++ } } # 型グロブ sub func2 { (*glob_a,*glob_b)=@_; foreach ( @glob_a ){ $_++ } foreach ( 0..$#glob_b ){ $glob_b[$_]++ } } ★PerlFAQ : どうすればファイルハンドルを間接的に扱えますか? http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq5.html 間接ファイルハンドルは、あるファイルハンドルを期待している場所に置かれた シンボル以外のなにかを使っています。以下にそういったものの例を挙げます: $fh = SOME_FH; # bareword は strict-subs に反します $fh = "SOME_FH"; # strict-refs hostile; 同じパッケージのみ $fh = *SOME_FH; # 型グロブ $fh = \*SOME_FH; # 型グロブのリファレンス (bless可能) $fh = *SOME_FH{IO}; # blessされたIO::Handle (*SOME_FH 型グロブから) あるいは無名ファイルハンドルを生成するのに IO::*モジュールのnewメソッドを使い、 それをスカラー変数に格納してからそれを普通のファイルハンドルと同じように扱います。 use IO::Handle; # 5.004 以降 $fh = IO::Handle->new(); 後は普通のファイルハンドルと同じように使います。 Perlがファイルハンドルを期待しているところではどこでも間接ファイルハンドルを 使うことができるでしょう。間接ファイルハンドルは、ファイルハンドルを保持している スカラー変数にすぎません。print, open, seekのような関数や、 ダイヤモンド演算子はファイルハンドルとファイルハンドルを 保持しているスカラー変数の両方とも受け付けます。 ($ifh, $ofh, $efh) = (*STDIN, *STDOUT, *STDERR); print $ofh "Type it: "; $got = <$ifh> print $efh "What was that: $got"; ファイルハンドルを関数に渡した場合、渡される関数は二種類の書き方ができます: sub accept_fh { my $fh = shift; print $fh "Sending to indirect filehandle\n"; } 上記のようにする他に、型グロブを局所化してファイルハンドルを直接使うことも可能です: sub accept_fh { local *FH = shift; print FH "Sending to localized filehandle\n"; } 両方の形式とも、オブジェクトでも実際のファイルハンドルの型グロブでも動作します (ある場合においては文字列でも可能ですが、これはちょっとリスクがあります)。 accept_fh(*STDOUT); accept_fh($handle); 上の例では、ファイルハンドルを使う前にそれをスカラー変数に代入していました。 これは式でもなく、ハッシュや配列の添え字でもなく単純なスカラー変数だけが printやprintf、ダイヤモンド演算子と一緒に使えるのです。 単純なスカラー変数以外のものをファイルハンドルとして使うことは 不正で、コンパイルすらできません: @fd = (*STDIN, *STDOUT, *STDERR); print $fd[1] "Type it: "; # 間違い $got = <$fd[0]> # 間違い print $fd[2] "What was that: $got"; # 間違い printやprintfの場合には、ブロックを使ってその中にファイルハンドルを 含む式を置くことによって対処することができます: print { $fd[1] } "funny stuff\n"; printf { $fd[1] } "Pity the poor %x.\n", 3_735_928_559; # Pity the poor deadbeef. これらのブロックは妥当なものですから、より複雑なコードをその中に入れこむことができます。 以下の例はメッセージを二ヶ所のどちらかひとつに送り出します: $ok = -x "/bin/cat"; print { $ok ? $fd[1] : $fd[2] } "cat stat $ok\n"; print { $fd[ 1+ ($ok || 0) ] } "cat stat $ok\n"; このアプローチはprintやprintfをオブジェクトメソッドの呼び出しのように 扱うものですが、これはダイヤモンド演算子には使えません。 なぜなら、ダイヤモンド演算子はカンマなしの引数を取る関数ではなくて 本当の演算子だからです。 さて、上記の例のように型グロブをあなたの作った構造に格納したとしましょう。 readlineという名前の組み込み関数を使って <> が行うようにレコードを 読み込むことができます。 @fdを例にあったように初期化してやることでうまく動作します。 しかしこれは、readline()は型グロブを要求するからです。 これはオブジェクトや文字列では動作しません。 このことはバグとも言えるもので現時点では修正されていません。 $got = readline($fd[0]); 間接ファイルハンドルの妙な点はそれが文字列であるか、型グロブであるか、 オブジェクトであるか、はたまた別の何者であるかには関係しないということに 注意して ください。これは基本的な演算子の構文なのです。 オブジェクトをいじくりまわして遊ぶことはここでは何の助けにもなりません。