2012-01-22 22 views
22

मैं एक संख्या होने के प्रत्येक लाइन के साथ, एक डेटा फ़ाइल है में एक डेटा फ़ाइल को पढ़ने के लिए सही तरीका,एक सरणी

10 
20 
30 
40 

मैं इस फ़ाइल कैसे पढ़ सकते हैं और एक सरणी में डेटा स्टोर करते हैं की तरह?

ताकि मैं इस सरणी पर कुछ संचालन कर सकूं।

उत्तर

57

बस एक सरणी में फ़ाइल को पढ़ने, तत्व प्रति एक लाइन, तुच्छ है:

open my $handle, '<', $path_to_file; 
chomp(my @lines = <$handle>); 
close $handle; 

अब फाई की लाइनें ले सरणी @lines में हैं।

use File::Slurp; 
my @lines = read_file("filename", chomp => 1); # will chomp() each line 

आप प्रत्येक पंक्ति आप read_file के सामने grep उपयोग के कुछ मान्यता की जरूरत है:

+4

आपको रिटर्न वैल्यू की जांच करके या ऑटोडी का उपयोग करके 'ओपन' असफल होने के लिए केस को वास्तव में संभालना चाहिए। सही तरीके से सही होने के लिए आपको 'करीबी' के लिए भी ऐसा ही करना चाहिए। – zgpmax

1

Tie::File तुम क्या जरूरत है:

सार

# This file documents Tie::File version 0.98 
use Tie::File; 

tie @array, 'Tie::File', 'filename' or die ...; 

$array[13] = 'blah';  # line 13 of the file is now 'blah' 
print $array[42];  # display line 42 of the file 

$n_recs = @array;  # how many records are in the file? 
$#array -= 2;   # chop two records off the end 


for (@array) { 
    s/PERL/Perl/g;   # Replace PERL with Perl everywhere in the file 
} 

# These are just like regular push, pop, unshift, shift, and splice 
# Except that they modify the file in the way you would expect 

push @array, new recs...; 
my $r1 = pop @array; 
unshift @array, new recs...; 
my $r2 = shift @array; 
@old_recs = splice @array, 3, 7, new recs...; 

untie @array;   # all finished 
+7

IMHO 'टाई :: फ़ाइल' एक फ़ाइल को पढ़ने और सामग्री को सरणी में रखने के लिए एक साधारण कार्य के लिए एक ओवरकिल है। – dgw

+1

[टाई :: फ़ाइल] (http://p3rl.org/Tie::File) तब तक अधिक है जब तक कि आपकी फ़ाइल बहुत बड़ी न हो। –

10

वहाँ सबसे आसान तरीका, File::Slurp मॉड्यूल का उपयोग कर रहा है।

उदाहरण के लिए, फिल्टर लाइनों जो केवल पूर्णांकों होते हैं:

my @lines = grep { /^\d+$/ } read_file("filename", chomp => 1); 
+1

वास्तव में नहीं। आप ** chomp ** भूल गए हैं। शायद यह बेहतर काम करेगा: मेरा @data = map {chomp $ _; $ _} read_file ("फ़ाइल नाम"); –

+0

पहले मैंने ध्यान नहीं दिया था, फ़ाइल की प्रत्येक पंक्ति में एक संख्या होती है। इसलिए, 'chomp' के बजाय' map' में संख्याओं के लिए रेगेक्स डालना बेहतर होगा। अपडेट किया गया। – Taras

+2

पहले। अगर किसी को वास्तव में chomp() की आवश्यकता है तो मानचित्र के बजाय read_file ("filename", chomp => 1) विकल्प का उपयोग करें। दूसरा। मुझे नहीं लगता कि किसी को वास्तव में एक सत्यापन की जरूरत है। सवाल यह नहीं है कि फ़ाइल से संख्याओं को कैसे पढ़ा जाए। तीसरा। आप 3.1415 जैसी संख्याओं की जांच नहीं करते हैं। आगे। आप शायद मानचित्र के बजाय grep {/^\ d + /} का उपयोग करना चाहते हैं। –

8

मुझे पसंद है ...

@data = `cat /var/tmp/somefile`; 

यह दूसरों के रूप में के रूप में आकर्षक नहीं है, लेकिन, यह सब एक ही काम करता है। और ...

$todays_data = '/var/tmp/somefile' ; 
open INFILE, "$todays_data" ; 
@data = <INFILE> ; 
close INFILE ; 

चीयर्स।

+1

मैं सुझाव देता हूं कि 'chomp': '@data = grep {chomp; } \ 'बिल्ली/var/tmp/somefile \'; ' – brablc

+1

यह करने के लिए यह एक बहुत अच्छा या सुरक्षित तरीका नहीं है। Http://perl-begin.org/tutorials/bad-elements/#slurp देखें – 0112