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
È stato utile?

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 ().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top