我正在试图弄清楚如何让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>
感谢。任何建议都非常感谢。
答案 0 :(得分:4)
您的$filehandle
应该已经打开 - 您已打开FILECOPY
,参考并将其放入$FH_ref
,$filehandle
。如果您想再次重新打开它,请使用<&
中的open
参数,或者立即开始阅读 。
答案 1 :(得分:2)
如果我理解正确,你想要相当于
open my $fh, '<&STDIN'
那将是
open my $fh, '<&', $filehandle
我不知道你为什么要这样做。