2012-07-16 6 views
7

私は、Perlモジュールが尊重してファイルハンドルへの参照を開く方法を理解しようとしています。その後、参照を渡す基本的にSTDINファイルハンドルのコピーを取り除く方法は?

#!/usr/bin/perl 
use strict; 
use warnings; 

use lib '/usr/local/share/custom_pm'; 
use Read_FQ; 

# open the STDIN filehandle and make a copy of it for (safe handling) 
open(FILECOPY, "<&STDIN") or die "Couldn't duplicate STDIN: $!"; 

# filehandle ref 
my $FH_ref = \*FILECOPY; 

# pass a reference of the filehandle copy to the module's subroutine 
# the value the perl module returns gets stored in $value 
my $value = {Read_FQ::read_fq($FH_ref)}; 

# do something with $value 

が、私は(安全な取り扱いのための)STDINファイルハンドルのコピーを作成し、STDINを介して入力を受信するためのメインプログラムをしたい:あなたは、メインプログラムを見ると、私が何を意味するかを理解しましょうそのコピーをRead_FQ.pmファイル(perlモジュール)のread_fq()サブルーチンに渡します。サブルーチンは、そのファイルハンドルから入力を読み取り、処理して値を返します。ここでは、Read_FQ.pmファイル:

package Read_FQ; 

sub read_fq{ 
my ($filehandle) = @_; 
my contents = ''; 

open my $fh, '<', $filehandle or die "Too bad! Couldn't open $filehandle for read\n"; 
while (<$fh>) { 
# do something 
} 
close $fh; 
return $contents; 

ここで私は問題に遭遇しています。ターミナルでは、私が開くようにメインプログラムにファイル名を渡すとき:

cat file.txt | ./script01.pl

それは、次のエラーメッセージを表示します。Too bad! Couldn't open GLOB(0xfa97f0) for read

この問題は、私は逆参照していますどのようにあることを私に伝えますperlモジュールのファイルハンドルへの参照を開きます。メインプログラムは大丈夫です。私は$refGlob = \*FILE;がファイルハンドルへの参照であり、ほとんどの場合、自動的にPerlによって参照解除されるべきであると読んでいます。ただし、ここではそうではありません。誰も私がそれを処理することができるようにファイルハンドルリファレンスを逆参照する方法を知っていますか?

ありがとうございました。どんな提案も大歓迎です。

答えて

4

$filehandleは既に開いている必要があります。FILECOPYを開いて、参考にして$FH_ref、つまり$filehandleにしてください。再度開く場合は、引数をopenに入力するか、からただちにから読み取りを開始してください。

+0

ああ大丈夫です。ですから、モジュールで再度filehandle refを開く必要はありません。すぐに '$ FH_ref'から読むことができます。さて、それは明らかです。私はそれを使用するためにそれを推論する必要があると思った。ありがとう – cooldood3490

2

私が正しく理解していれば、あなたがそれをする理由、あなたは

open my $fh, '<&', $filehandle 

だろう

open my $fh, '<&STDIN' 

と同等のものを欲しいでも、私は知りません。

関連する問題