2009-04-17 23 views
20

एक मानक पर्ल प्रत्येक स्क्रिप्ट मेरे पास है के लिए खुला समारोह फ़ाइल जोड़ना थोड़ा कष्टप्रद है:सबसे आसान तरीका

sub openfile{ 
    (my $filename) = @_; 
    open FILE,"$filename" or die $!; 
    my @lines = <FILE>; 
    return @lines; 
} 

और मैं करने के लिए एक पर्ल मॉड्यूल बना सकते हैं ऐसा करो, लेकिन यह इतना आसान है कि मुझे यकीन है कि वहां पहले से ही एक होना चाहिए।

मैं एक सरणी में एक पाठ फ़ाइल को पढ़ने के लिए एक रास्ता खोजने के लिए मैं नहीं कर सकते और वहाँ बाहर है कि इस सरल कार्य कर सकते हैं एक पर्ल मॉड्यूल को खोजने के लिए लग रहे हैं ... शायद मैं भी कठिन देख रहा हूँ यह कोशिश कर रहा हूँ, और पहले से ही मानक 5.10 स्थापित के साथ आया था।

बेहतर मेरा मानना ​​है कि यह कुछ इस तरह दिखेगा:

my @lines = Module::File::Read("c:\some\folder\structure\file.txt"); 
+0

मैं अत्यधिक CSV फ़ाइलों के साथ काम करने के लिए इच्छुक किसी के लिए पाठ :: सीएसवी :: Slurp की सिफारिश करेंगे । इस मॉड्यूल ने दो या तीन अन्य लोगों की तुलना में काफी बेहतर काम किया। अगला सबसे अच्छा सीएसवी :: Slurp :: सरल या कुछ पंक्तियों के साथ कुछ था, हालांकि पाठ :: सीएसवी :: Slurp के रूप में मजबूत नहीं है। – Brian

+2

'ओपन()' के 3 तर्क फॉर्म का उपयोग करें http://p3rl.org/open –

उत्तर

27

आपके पास कई विकल्प है, क्लासिक करना विधि:

my @array = do { 
    open my $fh, "<", $filename 
     or die "could not open $filename: $!"; 
    <$fh>; 
}; 

IO::All विधि:

use IO::All; 

my @array = io($filename)->slurp; 

File::Slurp विधि:

use File::Slurp; 

my @array = read_file($filename); 

और शायद TIMTOWTDI के बाद, और भी बहुत कुछ।

+0

निश्चित रूप से फ़ाइल :: Slurp विधि की तरह। आपको बहुत - बहुत धन्यवाद! – Brian

+0

ध्यान दें कि फ़ाइल :: स्लर्प पर्ल आईओ परतों की भविष्यवाणी करता है, और इसलिए 'PERL_UNICODE'/'perl -C' सेटिंग्स का सम्मान नहीं करेगा जो आश्चर्यजनक हो सकता है जब आप उचित यूनिकोड समर्थन के साथ पर्ल स्क्रिप्ट लिखने का प्रयास कर रहे हों। पथ :: छोटे यूनिकोड समर्थन के साथ छोटा विकल्प हो सकता है। –

15

प्रसिद्ध "slurp मोड" है:

my @lines = <FILEHANDLE> ; 

आप भी देख सकते हैं Perl Slurp Ease

+1

"स्लर्प मोड" का उपयोग आम तौर पर एक अलग स्केलर में पूरी फ़ाइल को पढ़ने के लिए किया जाता है, रिकॉर्ड विभाजक $/undef को सेट करके। – ysth

+0

मैंने स्लर्प मोड के रूप में वर्णित सरणी और स्केलर संदर्भ दोनों को देखा है, लेकिन मैंने सरणी शैली को अक्सर इस्तेमाल किया है। – codehearted

4

आपको सामान्य तकनीक मिल गई है, लेकिन मैं उस पेर्ल प्रकार में डालना चाहता हूं जो आपको ऐसा करने से हतोत्साहित करता है क्योंकि यह बहुत अक्सर ऐसा होता है कि आप वही कर सकते हैं जो आप एक-लाइन कर रहे हैं एक समय, जो स्वाभाविक रूप से कहीं अधिक कुशल है।

+0

एक अच्छा बिंदु, खासकर जब एक सरणी में पढ़ना। Arrays लाइनों द्वारा अनुक्रमिक प्रसंस्करण का संकेत है (या रिकॉर्ड अगर $/का उपयोग किया जा रहा है) जो अक्सर एक-आइटम-एक-बार बेहतर किया जाता है। हालांकि, ऐसे मामले हैं जहां स्लर्प के लिए उपयुक्त है। –

6

आप टाई :: फ़ाइल का उपयोग करने पर भी विचार करना चाहेंगे, खासकर अगर आप बड़ी फाइलें पढ़ रहे हैं और पूरी फाइल को स्मृति में पढ़ना नहीं चाहते हैं। यह एक कोर मॉड्यूल है। इसके अलावा, कृपया perlfaq5 देखें।

2

त्वरित और गंदे के लिए, मुझे @ARGV के साथ मिलिंग की सादगी पसंद है।

# Ysth is right, it doesn't automatically die; I need another line. 
use 5.010; 
use strict; 
my @rows = do { 
    use warnings FATAL => 'inplace'; # oddly enough, this is the one. ?? 
    @ARGV='/a/file/somewhere'; 
    <>; 
}; 
say q(Not gettin' here.); 

पर्ल * फ़ाइल नहीं खोल सकता है, यह स्वतः मर जाता है।


* - निष्पादन योग्य, इसलिए कृपया पूंजीकरण न करें।

+1

मुझे नहीं पता था कि पर्ल एक संक्षिप्त नाम नहीं था! सर उठाने के लिए धन्यवाद। – Brian

+1

क्षमा करें, नोट आपके लिए नहीं था, लेकिन कुख्यात पूंजी-पी गिरोह के लिए। जब आप विशेष रूप से निष्पादन योग्य होते हैं तो वे आपकी पोस्ट में टूट जाएंगे और आपके पी को पूंजीकृत करेंगे। भाषा केवल पूंजी-पी प्राप्त होती है। हालांकि, कोई एनाग्राम नहीं है। – Axeman

+0

re.pl # इसके perl, लेकिन इसका एक रीड-इवल-पार्स-लूप :) –

6

Perl6::Slurp पर भी एक नज़र डालें जो स्लर्प के पर्ल 6 संस्करण को लागू करता है और "पर्ल बेस्ट प्रैक्टिस" पुस्तक में अनुशंसित है।

कुछ उदाहरण ....

my @lines   = slurp 'filename'; 
my @lines_chomped = slurp 'filename', { chomp => 1 }; 
my @lines_utf8 = slurp 'filename', { utf8 => 1 }; 
1

मैं एक वस्तु उन्मुख दृष्टिकोण है कि कोर वितरण के बाहर मॉड्यूल नहीं की आवश्यकता है करता है और कहीं भी काम करेंगे की सिफारिश करेंगे:

use strict; 
use warnings; 
use IO::File; 
my $fh = IO::File->new("< $file"); 

foreach ($fh->getlines) { 
    do_something($_); 
} 
$fh->close 
संबंधित मुद्दे