Potete usare il modulo File::Slurp per fare questo in un solo passo.
use File::Slurp;
$tutto_quanto = read_file($nomefile); # l'intero file in uno scalare
@tutte_le_linee = read_file($nomefile); # una linea per elemento
L'approccio proprio del Perl per svolgere un'operazione su tutte le linee
di un file, consiste nel farlo una linea alla volta:
open (INPUT, $file) || die "non posso aprire $file: $!";
while (<INPUT>) {
chomp;
# fai qualcosa con $_
}
close(INPUT) || die "non posso chiudere $file: $!";
Questo è tremendamente più efficiente del leggere l'intero
file in memoria come un array di linee e poi svolgere l'operazione su di esso
un elemento alla volta, che è spesso--se non quasi sempre--l'approccio
sbagliato. Tutte le volte che vedete questo:
@linee = <INPUT>;
dovreste pensare a lungo e accuratamente sul perché avete bisogno di
avere tutto caricato in una volta. È semplicemente una soluzione
non scalabile. Potreste anche trovare più divertente l'uso del
modulo standard Tie::File, o i binding $DB_RECNO del modulo DB_File, che
vi permettono di legare un array ad un file in maniera tale che accedendo
ad un elemento dell'array di fatto si acceda alla linea corrispondente
nel file.
Potete leggere l'intero contenuto del filehandle in uno scalare
{
local(*INPUT, $/);
open (INPUT, $file) || die "non posso aprire $file: $!";
$variabile = <INPUT>;
}
Quel codice rende temporaneamente indefinito il vostro separatore di record,
e chiuderà automaticamente il file all'uscita del blocco. Se il
file è già aperto, limitatevi ad usare questo:
$variabile = do { local $/; <INPUT> };
Per i file ordinari potete inoltre usare la funzione read.
read( INPUT, $variabile, -s INPUT );
Il terzo argomento verifica la dimensione in byte dei dati sul filehandle
INPUT e legge quel numero di byte nel buffer $variabile.
|