2012-07-16 33 views
7

मैं यह समझने की कोशिश कर रहा हूं कि पर्ल मॉड्यूल को कैसे सम्मानित किया जाए और फ़ाइलहेडल के संदर्भ को खोलें। आप समझते हैं कि मैं क्या मतलब है जब आप मुख्य प्रोग्राम देखें:एक एसटीडीआईएन फ़ाइल की एक प्रति को कैसे खराब करें?

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

असल में, मैं STDIN के माध्यम से इनपुट प्राप्त करने के लिए, (सुरक्षित संचालन के लिए) STDIN filehandle की एक प्रतिलिपि बनाने मुख्य प्रोग्राम चाहते हैं तो एक संदर्भ पारित Read_FQ.pm फ़ाइल (perl मॉड्यूल) में read_fq() subroutine पर उस प्रतिलिपि के लिए। तब subroutine उस फ़ाइल हैंडल से इनपुट पढ़ेगा, इसे संसाधित करेगा, और एक मूल्य वापस करेगा। यहां 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; 

यहां मैं परेशानी में भाग रहा हूं। टर्मिनल में, जब मैं मुख्य कार्यक्रम के लिए एक फ़ाइल नाम पारित खोलने के लिए:

cat file.txt | ./script01.pl

यह निम्न त्रुटि संदेश देता है: Too bad! Couldn't open GLOB(0xfa97f0) for read

यह मुझसे कहता है समस्या मैं कैसे अपसंदर्भन और कर रहा हूँ यह है कि पर्ल मॉड्यूल में फ़ाइलहेडल के संदर्भ को खोलना। मुख्य कार्यक्रम ठीक है। मैंने पढ़ा है कि $refGlob = \*FILE; फ़ाइल हैंडल का संदर्भ है और ज्यादातर मामलों में, पर्ल द्वारा स्वचालित रूप से संदर्भित किया जाना चाहिए। हालांकि, यह वह मामला यहां नहीं है। क्या किसी को पता है कि फाइलहेडल रेफरी को कैसे डिफरेंस करना है ताकि मैं इसे संसाधित कर सकूं?

धन्यवाद। कोई भी सुझाव अति सराहनीय है।

उत्तर

4

आपका $filehandle पहले से ही खुला होना चाहिए - आपने FILECOPY खोला था, एक संदर्भ लिया और इसे $FH_ref में रखा, जो $filehandle है। यदि आप इसे दोबारा खोलना चाहते हैं तो तर्क open में तर्क का प्रयोग करें या से तुरंत पर पढ़ना शुरू करें।

+0

आह ठीक है जो समझ में आता है। इसलिए मुझे मॉड्यूल में फिर से फाइलहेडल रेफ को फिर से खोलने की आवश्यकता नहीं है। मैं अभी '$ FH_ref' से तुरंत पढ़ना शुरू कर सकता हूं। ठीक है, यह स्पष्ट है। मैंने सोचा कि इसे इस्तेमाल करने के लिए मुझे इसे सम्मानित करने की आवश्यकता है। धन्यवाद – cooldood3490

2

अगर मैं सही ढंग से समझ, आप

open my $fh, '<&STDIN' 

के बराबर यही होगा

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

मैं क्यों आपको लगता है कि चाहते हैं, हालांकि पता नहीं करना चाहती।