7

Perlモジュールを参照してファイルハンドルへの参照を開く方法を見つけようとしています。メインプログラムを見れば、私が何を意味するか理解できるでしょう:

#!/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

2 に答える 2

4

あなた$filehandleはすでに開いているはずです - あなたはすでに開いていてFILECOPY、参照を取り、それを入れていまし$FH_ref$filehandle。もう一度開きたい場合は、 in の<&引数を使用するか、すぐopenに読み取りを開始します。

于 2012-07-16T20:58:27.273 に答える
3

私が正しく理解していれば、3つの引数に相当するものが必要です

open my $fh, '<&STDIN'

それは

open my $fh, '<&', $filehandle
于 2012-07-16T20:59:00.567 に答える