Come posso leggere i paragrafi alla volta con Perl?
Domanda
Quando scrivo
#!/usr/bin/perl -w
use strict;
while( <DATA> ) {
print "\n-------------------------\n\n";
print;
<>;
}
dopo ogni " return " Ottengo una riga.
Perché non ottengo con lo script successivo dopo ogni " return " un paragrafo?
#!/usr/bin/perl -w
use strict;
local $/ = "";
while( <DATA> ) {
print "\n-------------------------\n\n";
print;
<>;
}
__DATA__
line one
line two
line three
line four
line five
line six
line seven
line eigth
line nine
line ten
line eleven
line twelve
Soluzione
Nel tuo primo script, con la variabile $ / impostata su " \ n " ;, il < DATA > restituirà solo una riga alla volta.
Credo che il secondo script faccia quello che vuoi, è solo che < > non termina la lettura su un 'return' ma piuttosto su un < ctrl-d > a causa della tua impostazione $ / (come qualcun altro ha sottolineato < > legge da STDIN ma penso che tu lo sappia già e lo stai usando per regolare l'output).
Se vuoi veramente regolare l'output con 'return' allora devi fare di più con $ / nel ciclo.
while( <DATA> ) { print "\n-------------------------\n\n"; print; $/ = "\n"; # default so that the following terminates the read on 'return' <>; $/ = ""; }
Altri suggerimenti
Suppongo che ti aspetti questa linea
local $/ = "";
per modificare il comportamento di
<DATA>
per continuare a leggere fino alla fine dei dati.
Ma in effetti ci vuole qualcosa del genere
{
local $/; # $/ becomes undef in this block
...
}
per abilitare modalità slurp (e contiene quella modalità nell'ambito nell'ambito di {curlys}).
In effetti sta dicendo " dimentica di pensare alle newline come il marker di fine record " ;,
Oltre a questo ... c'è un lottatore di cravatte nel tuo codice!
while( <DATA> ) {
print "\n-------------------------\n\n";
print;
<>; # <-- Feel the power of the DARK SIDE!!!
}
Questo piccoletto leggerà da STDIN, non da DATA - è davvero quello che vuoi?
Uso di < > in questo modo (interattivo) in modalità paragrafo sarà confuso. Non ritornerà quando premi & Quot; return & Quot ;; invece, leggerà fino a quando non otterrà una riga non vuota (l'inizio di un paragrafo), quindi leggerà fino a quando non otterrà una riga vuota (la fine di quel paragrafo), quindi continuerà a leggere fino a quando non otterrà una riga non vuota (l'inizio del paragrafo seguente - che verrà bufferizzato, non restituito) in modo che sappia che ha scartato eventuali righe vuote extra.
Forse dovresti usare:
local $/ = "\n"; <>
invece alla fine del ciclo. O forse POSIX :: getchar ().