如何取消引用STDIN文件句柄的副本?

时间:2012-07-16 20:49:21

标签: perl reference stdin perl-module filehandle

我正在试图弄清楚如何让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文件中的read_fq()子例程(perl模块)。然后,子例程将从该文件句柄读取输入,处理它并返回一个值。这里是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自动取消引用。但是,这不是这种情况。有谁知道如何取消引用文件句柄引用以便我可以处理它?<​​/ p>

感谢。任何建议都非常感谢。

2 个答案:

答案 0 :(得分:4)

您的$filehandle应该已经打开 - 您已打开FILECOPY,参考并将其放入$FH_ref$filehandle。如果您想再次重新打开它,请使用<&中的open参数,或者立即开始阅读

答案 1 :(得分:2)

如果我理解正确,你想要相当于

open my $fh, '<&STDIN'

那将是

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

我不知道你为什么要这样做。