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.
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