2012-07-16 14 views
7

Ich versuche herauszufinden, wie Sie ein Perl-Modul zum Deference bekommen und einen Verweis auf ein Dateihandle öffnen. Sie werden verstehen, was ich meine, wenn Sie das Hauptprogramm zu sehen:Wie kann eine Kopie eines STDIN-Dateihandles deaktiviert werden?

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

Grundsätzlich ich das Hauptprogramm will Eingang über STDIN zu erhalten, eine Kopie des STDIN Dateihandle machen (zum sicheren Umgang) dann einen Verweis übergeben zu dieser Kopie in die read_fq() - Subroutine in der Read_FQ.pm-Datei (das Perl-Modul). Die Subroutine liest dann die Eingabe von dieser Dateikennung, verarbeitet sie und gibt einen Wert zurück. Hier die Read_FQ.pm Datei:

Hier ist, wo ich in Schwierigkeiten gerate. Im Terminal, wenn ich einen Dateinamen in das Hauptprogramm übergeben zu öffnen:

cat file.txt | ./script01.pl

es gibt die folgende Fehlermeldung: Too bad! Couldn't open GLOB(0xfa97f0) for read

Das sagt mir, dass das Problem ist, wie ich bin dereferencing und Öffnen des Verweises auf das Dateihandle im Perl-Modul. Das Hauptprogramm ist in Ordnung. Ich habe gelesen, dass $refGlob = \*FILE; eine Referenz auf ein Datei-Handle ist und in den meisten Fällen automatisch von Perl dereferenziert werden sollte. Dies ist jedoch nicht der Fall. Weiß jemand, wie man einen Aktenreferenz dereferenziert, damit ich es verarbeiten kann?

danke. Irgendwelche Vorschläge werden sehr geschätzt.

Antwort

4

Ihre $filehandle sollte bereits geöffnet sein - Sie hatten FILECOPY geöffnet, eine Referenz genommen und setzen Sie in $FH_ref, die $filehandle ist. Wenn Sie es erneut öffnen möchten, verwenden Sie das <& Argument in open oder lesen Sie einfach davon sofort.

+0

ah okay, das macht Sinn. Daher muss ich das Dateihandle Ref nicht erneut im Modul öffnen. Ich kann sofort anfangen, von '$ FH_ref' zu lesen. Okay, das ist klar. Ich dachte, ich müsste es respektieren, um es zu benutzen. Vielen Dank – cooldood3490

2

Wenn ich richtig verstehe, wollen Sie das Äquivalent von

open my $fh, '<&STDIN' 

Das wäre

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

Ich weiß nicht, warum Sie das wollen, though.