Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to derefence a copy of a STDIN filehandle?

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.

like image 506
cooldood3490 Avatar asked Jul 16 '12 20:07

cooldood3490


2 Answers

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.

like image 82
amon Avatar answered Oct 14 '22 13:10

amon


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

open my $fh, '<&STDIN'

That would be

open my $fh, '<&', $filehandle
like image 22
ikegami Avatar answered Oct 14 '22 12:10

ikegami