2012-01-22 17 views

risposta

57

Proprio la lettura del file in un array, una linea per ogni elemento, è banale:

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

Ora le linee del fi le sono nell'array @lines.

+4

Si dovrebbe veramente gestire il caso per il fallimento "open", controllando il valore restituito o usando autodie. Per essere correttamente corretto dovresti fare lo stesso anche per la "chiusura". – zgpmax

1

Tie::File è quello che vi serve:

Sinossi

# 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' è un overkill per un compito semplice come leggere un file e inserire il contenuto in un array. – dgw

+1

[Tie :: File] (http://p3rl.org/Tie::File) è eccessivo a meno che il file non sia molto grande. –

10

V'è il metodo più semplice, utilizzando il modulo File::Slurp:

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

Se avete bisogno di un po 'di convalida per ogni linea è possibile utilizzare grep davanti read_file.

Ad esempio, le linee di filtro che contengono solo numeri interi:

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

Non proprio. Hai dimenticato ** chomp **. Forse funzionerebbe meglio: my @data = map {chomp $ _; $ _} read_file ("nomefile"); –

+0

All'inizio non avevo prestato attenzione, ogni riga di un file contiene un numero. Quindi, sarà meglio mettere le espressioni regolari per i numeri in 'map' invece di' chomp'. Aggiornato. – Taras

+2

Primo. Se qualcuno ha davvero bisogno di chomp() usa l'opzione read_file ("nomefile", chomp => 1) invece di una mappa. Secondo. Non penso che qualcuno abbia davvero bisogno di una convalida. La domanda non è come leggere i numeri da un file. Terzo. Non controlli i numeri come 3.1415. Via. Probabilmente vorresti usare grep {/^\ d + /} invece di una mappa. –

8

mi piace ...

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

non è così glamour come gli altri, ma, funziona lo stesso. E ...

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

Cheers.

+1

Suggerirei di aggiungere 'chomp': ' @data = grep {chomp; } \ 'cat/var/tmp/somefile \'; ' – brablc

+1

Questo non è un modo molto buono o sicuro per farlo. Vedi http://perl-begin.org/tutorials/bad-elements/#slurp – 0112

Problemi correlati