2012-07-16 12 views
7

Próbuję dowiedzieć się, jak uzyskać moduł Perla do szacunku i otworzyć odniesienie do uchwytu pliku. zrozumiesz co mam na myśli, kiedy pojawi się główny program:Jak usunąć kopię uchwytu pliku 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 

Zasadniczo chcę głównego programu do otrzymania wkładu poprzez STDIN, zrób kopię uchwytu pliku standardowego wejścia (dla bezpiecznego użytkowania), a następnie przekazać odwołanie do tej kopii do podprogramu read_fq() w pliku Read_FQ.pm (moduł perla). Podprogram następnie odczyta dane wejściowe z tego uchwytu pliku, przetworzy je i zwróci wartość. Oto plik 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; 

Oto gdzie biegnę w kłopoty. W terminalu, kiedy przekazać nazwę pliku do programu głównego, aby otworzyć:

cat file.txt | ./script01.pl

daje się następujący komunikat o błędzie: Too bad! Couldn't open GLOB(0xfa97f0) for read

to mówi mi, że problemem jest to, jak ja i wyłuskania otwarcie odnośnika do uchwytu pliku w module perla. Główny program jest w porządku. Przeczytałem, że $refGlob = \*FILE; jest odniesieniem do uchwytu pliku iw większości przypadków powinno być automatycznie dereferencji przez Perl. Jednak tak nie jest w tym przypadku. Czy ktoś wie, jak usunąć odwołanie z pliku filehandle, aby móc go przetworzyć?

dzięki. Wszelkie sugestie są bardzo mile widziane.

Odpowiedz

4

Twój $filehandle powinna już być otwarta - trzeba było otwarte FILECOPY, podjęte odniesienie i umieścić go w $FH_ref, który jest $filehandle. Jeśli chcesz ponownie otworzyć go ponownie, użyj argumentuw open lub po prostu zacznij czytać od niego od razu.

+0

OK, to ma sens. Nie muszę ponownie otwierać pliku filehandle ref w module. Mogę po prostu zacząć czytać od '$ FH_ref' od razu. Okay, to jasne. Pomyślałem, że muszę go pokłonić, żeby z niego skorzystać. dzięki – cooldood3490

2

Jeśli dobrze rozumiem, chcesz równowartość

open my $fh, '<&STDIN' 

To byłoby

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

Nie wiem dlaczego chcesz to, choć.

Powiązane problemy