Newsgroup: it.comp.lang.perl
Titolo: lettura righe file

Salve a tutti ;-)
scusate la domanda un pò banale ma sono un principiante.
Usando i comandi:
    open (LISTA, "< lista.txt");
      while ($record=<LISTA>) {
apro un file e ne leggo tutte le righe una alla volta.
Se invece io volessi aprire il file e leggere ad esempio solo le righe da 10
a 20
che comandi dovrei usare?
grazie per l'attenzione
    Roberto
--
Italian DivX & Covers Database
http://divx.home.dk3.com/

 che comandi dovrei usare?
Puoi usare qualcosa del genere:
open(LISTA,"<lista.txt");
foreach (1..9) { <LISTA> };
foreach (10..20) {
     $record = <LISTA>;
     print $record;
}
close(LISTA);
Se invece le dimensioni delle righe sono fisse è meglio
usare la funzione seek per posizionarti all'inizio della
decima righa senza dover leggere le precedenti.
Ciao.
Marco Gazerro

Marco Gazerro wrote:
A me piace piu' cosi':
open(LISTA,"<lista.txt");
while (<LISTA>) {
        $cnt++;
        next if $cnt<10;
        last if $cnt > 20;
        print;
}
-- 
Saluti,
Giancarlo

 }
Anche io lo preferisco. Tra l'altro non e` necessario
usare un contatore per sapere quale riga stai leggendo.
Perl definisce automaticamente la variabile '$.' Maggiori
informazioni in perlvar.
Il tuo pezzo di codice diventerebbe quindi
open( LISTA, "< lista.txt" ) || die "...bla bla bla";
while( <LISTA> ) {
    next if $. < 10;
    last if $. > 20;
    print;
}
Mi viene in mente anche l'operatore di range '..',
che in un contesto scalare ha una semantica interessante.
Usandolo, il codice diventa
while( <LISTA> ) {
    if (10 .. 20) print;
}
(se uno degli operandi e` un'espressione costante, allora
tale operando e` implicitamente confrontato con $.)
Ulteriori informazioni con perldoc perlop.
ciao
Stefano

 wrote in message
P%4k8.63975$_u5.1...@news1.tin.it...

corto:-) pero' dopa la 20ma riga continua a leggere , no?
---
Mario Rizzuti


foreach (1..9) { <LISTA> };
foreach (10..20) {
     $record = <LISTA>;
     ...
}
La forma che ho proposto la trovo più leggibile e divide il codice
che si posiziona nel file da quello che dovrà operare su di esso.
Comunque trovo che sia sempre una questione di stile personale. :-)
Ciao.
Marco Gazerro

 corto:-) pero' dopa la 20ma riga continua a leggere , no?
Hai ragione. Ne approfitto per correggere un errore sintattico
che mi era scappato.
while( <> ) {
    print if ( 10 .. 20 );
    last if $. > 20;
}
Oppure:
while( <> ) {
    print if ( 10 .. ($. == 20 && die()) );
}
Ma non lo userei per nessun motivo :)
(Notare che ho dovuto scrivere esplicitamente
$. == 20, poiche` 20 non e` piu` operando
dell'operatore di range).
ciao
Stefano

 Perl definisce automaticamente la variabile '$.'
Vero, non ci avevo pensato ;-)
-- 
Saluti,
Giancarlo

 ha scritto nel messaggio
news:x21k8.15576$1S3.4...@twister1.libero.it...


     Roberto
E' possibile un approccio piu` elegante ed efficiente
avvalendosi di Tie::File, di Mark Jason Dominus.
La soluzione generale al tuo problema sarebbe:
#!/usr/bin/perl
use Tie::File;
use strict;
my @array;
tie @array, 'Tie::File', $filename or
 die "Can't open file\n";
print @array[$start .. $end];
untie @array;
Ok. Fin qui l'eleganza d'espressione consentita dal
modulo. La potenza sta nel fatto che il file non
mantenuto interamente in memoria, bensi` letto
man mano che l'utente ne richiede delle nuove linee.
Tie::File e` nella core distribution di Perl (dalla versione
5.7.3, IIRC).
Ulteriori informazioni (anche qualche Caveat) nella
documentazione di Tie::File (che consiglio di leggere
in ogni caso).
ciao
Stefano