如何解压缩STDIN文件句柄的副本?

coo*_*490 7 perl stdin reference 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
Run Code Online (Sandbox Code Playgroud)

基本上,我希望主程序通过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;
Run Code Online (Sandbox Code Playgroud)

这是我遇到麻烦的地方.在终端中,当我将文件名传递给主程序打开时:

cat file.txt | ./script01.pl

它给出以下错误消息: Too bad! Couldn't open GLOB(0xfa97f0) for read

这告诉我问题是我如何取消引用并打开perl模块中文件句柄的引用.主程序没问题.我读到这$refGlob = \*FILE;是对文件句柄的引用,在大多数情况下,应该由Perl自动解除引用.但是,这不是这种情况.有谁知道如何取消引用文件句柄引用,以便我可以处理它?

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

amo*_*mon 4

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