2012-07-16 21 views
7

Estoy tratando de averiguar cómo obtener un módulo Perl de deferencia y abrir una referencia a un identificador de archivo. Vas a entender lo que quiero decir cuando vea el programa principal:¿Cómo quitar una copia de un identificador de archivo STDIN?

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

Básicamente, quiero que el programa principal para recibir la entrada a través de STDIN, hacer una copia del gestor de archivo STDIN (para una manipulación segura) y luego pasar una referencia a esa copia a la subrutina read_fq() en el archivo Read_FQ.pm (el módulo perl). La subrutina leerá la entrada de ese identificador de archivo, lo procesará y devolverá un valor. Aquí el archivo 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; 

Aquí es donde estoy corriendo en problemas. En la terminal, al pasar un nombre de archivo para el programa principal para abrir:

cat file.txt | ./script01.pl

se da el siguiente mensaje de error: Too bad! Couldn't open GLOB(0xfa97f0) for read

Esto me dice que el problema es cómo estoy y eliminación de referencias abriendo la referencia al identificador de archivo en el módulo perl. El programa principal está bien. Leí que $refGlob = \*FILE; es una referencia a un manejador de archivo y, en la mayoría de los casos, Perl debería desreferenciarlo automáticamente. Sin embargo, ese no es el caso aquí. ¿Alguien sabe cómo desreferenciar una referencia de manipulación de archivos para poder procesarla?

gracias. Cualquier sugerencia es bienvenida.

Respuesta

4

Su $filehandle ya debería estar abierto - que haya abierto FILECOPY, tomada una referencia y ponerlo en $FH_ref, que es $filehandle. Si desea volver a abrirlo de nuevo, use el argumento <& en open o simplemente comience a leer de inmediato.

+0

ah bien, eso tiene sentido. Por lo tanto, no es necesario volver a abrir Filehandle Ref nuevamente en el módulo. Puedo comenzar a leer '$ FH_ref' de inmediato. De acuerdo, eso está claro. Pensé que necesitaba deferencia para usarlo. Gracias – cooldood3490

2

Si he entendido bien, desea que el equivalente de

open my $fh, '<&STDIN' 

Eso sería

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

No sé por qué quiere que, sin embargo.

Cuestiones relacionadas