2012-01-22 13 views

Odpowiedz

57

Wystarczy czytania pliku do tablicy, jedna linia na element, jest trywialny:

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

Teraz linie fi le są w tablicy @lines.

+4

Naprawdę powinieneś poradzić sobie z przypadkiem "otwartego" błędu, sprawdzając wartość zwracaną lub używając autodie. Aby być właściwie poprawnym, powinieneś zrobić to samo dla "zamknięcia". – zgpmax

1

Tie::File jest to, czego potrzebujesz:

Synopsis

# 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 'Tie :: File' to przesada dla prostego zadania polegającego na odczytaniu pliku i umieszczeniu treści w tablicy. – dgw

+1

[Tie :: File] (http://p3rl.org/Tie::File) jest przesadny, chyba że twój plik jest bardzo duży. –

10

Jest to najprostsza metoda, za pomocą File::Slurp moduł:

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

Jeśli potrzebujesz walidacji dla każdej linii można wykorzystać grep przed read_file.

Na przykład, linie filtrów, które zawierają jedynie liczby całkowite:

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

Niezupełnie. Zapomniałeś ** chomp **. Być może to zadziała lepiej: my @data = map {chomp $ _; $ _} read_file ("filename"); –

+0

Na początku nie zwróciłem uwagi, każda linia pliku zawiera jeden numer. Tak więc lepiej będzie umieścić wyrażenie regularne dla liczb w 'map' zamiast' chomp'. Zaktualizowano. – Taras

+2

Najpierw. Jeśli ktoś naprawdę potrzebuje chomp(), użyj opcji read_file ("filename", chomp => 1) zamiast mapy. Druga. Nie sądzę, że ktoś naprawdę potrzebuje walidacji. Pytanie nie polega na czytaniu liczb z pliku. Trzeci. Nie sprawdzasz numerów takich jak 3.1415. Naprzód. Prawdopodobnie chcesz użyć grep {/^\ d + /} zamiast mapy. –

8

lubię ...

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

To nie jest tak efektowne jak inni, ale to działa tak samo. I ...

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

Pozdrawiam.

+1

Sugerowałbym dodanie 'chomp': ' @data = grep {chomp; } \ 'cat/var/tmp/somefile \'; ' – brablc

+1

Nie jest to dobry lub bezpieczny sposób na zrobienie tego. Zobacz http://perl-begin.org/tutorials/bad-elements/#slurp – 0112

Powiązane problemy