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