How to derefence a copy of a STDIN filehandle?
Asked Answered
C

2

7

I'm trying to figure out how to get a Perl module to deference and open a reference to a filehandle. You'll understand what I mean when you see the main program:

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

Basically, I want the main program to receive input via STDIN, make a copy of the STDIN filehandle (for safe handling) then pass a reference to that copy to the read_fq() subroutine in the Read_FQ.pm file (the perl module). The subroutine will then read the input from that file handle, process it, and return a value. Here the Read_FQ.pm file:

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;

Here's where I'm running into trouble. In the terminal, when I pass a filename to the main program to open:

cat file.txt | ./script01.pl

it gives the following error message: Too bad! Couldn't open GLOB(0xfa97f0) for read

This tells me that the problem is how I'm dereferencing and opening the reference to the filehandle in the perl module. The main program is okay. I read that $refGlob = \*FILE; is a reference to a file handle and in most cases, should automatically be dereferenced by Perl. However, that isn't that case here. Does anyone know how to dereference a filehandle ref so that I can process it?

thanks. Any suggestions are greatly appreciated.

Cornelius answered 16/7, 2012 at 20:49 Comment(0)
I
4

Your $filehandle should already be open - you had opened FILECOPY, taken a reference and put it in $FH_ref, which is $filehandle. If you want to re-open it again use the <& argument in open or just start reading from it right away.

Inglebert answered 16/7, 2012 at 20:58 Comment(1)
ah okay that makes sense. So I don't need to re-open filehandle ref again in module. I can just start reading from $FH_ref right away. Okay, that's clear. I thought I needed to deference it in order to use it. thanksCornelius
J
3

If I understand correctly, you want the 3-arg equivalent of

open my $fh, '<&STDIN'

That would be

open my $fh, '<&', $filehandle
Josephina answered 16/7, 2012 at 20:59 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.