Pregunta

Cuando escribo

#!/usr/bin/perl -w
use strict;

while( <DATA> ) {
    print "\n-------------------------\n\n";
    print;
    <>;
}

después de cada " return " Tengo una línea.

¿Por qué no obtengo el siguiente script después de cada " return " un párrafo?

#!/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
¿Fue útil?

Solución

En su primer script, con la variable $ / establecida como predeterminada " \ n " ;, el < DATA > solo devolverá una línea a la vez.

Creo que el segundo script hace lo que quieres, es solo que < > no terminará la lectura en un 'retorno' sino en un < ctrl-d > debido a su configuración $ / (como alguien más señaló < > lee de STDIN pero creo que ya lo sabe y lo está utilizando para regular la salida).

Si realmente desea regular la salida con 'return', entonces necesita hacer más con $ / en el ciclo.

while( <DATA> ) {
    print "\n-------------------------\n\n";
    print;
    $/ = "\n"; # default so that the following terminates the read on 'return'
    <>;
    $/ = ""; 
}   

Otros consejos

Creo que estás esperando esta línea

local $/ = "";

para cambiar el comportamiento de

<DATA>

para seguir leyendo hasta el final de los datos.

Pero, de hecho, se necesita algo como esto

{
    local $/;  # $/ becomes undef in this block
    ...
}

para habilitar modo slurp (y para contener ese modo al alcance dentro de {curlys}).

En efecto, dice " olvídate de pensar en las nuevas líneas como el marcador de fin de registro " ;,

Además de eso ... ¡hay un luchador de corbata en tu código!

while( <DATA> ) {
    print "\n-------------------------\n\n";
    print;
    <>;    # <-- Feel the power of the DARK SIDE!!!
}

Este pequeño leerá de STDIN, no de DATOS, ¿es eso realmente lo que quieres?

Usando < > de esa manera (interactivamente) en el modo párrafo será confuso. No volverá cuando presione & Quot; return & Quot ;; en su lugar, leerá hasta que obtenga una línea no vacía (el comienzo de un párrafo), luego leerá hasta que obtenga una línea vacía (el final de ese párrafo), luego continuará leyendo hasta que obtenga una línea no vacía (el comienzo del siguiente párrafo, que se almacenará en el búfer, no se devolverá) para que sepa que se descartaron las líneas vacías adicionales.

Quizás deberías estar usando:

local $/ = "\n"; <>

al final de su ciclo en su lugar. O tal vez POSIX :: getchar ().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top