Pergunta

Quando eu escrevo

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

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

Após cada "retorno", recebo uma linha.

Por que não entendo o próximo script após cada "retornar" um parágrafo?

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

Solução

Em seu primeiro script, com a $/ variável definida como padrão " n", ou003CDATA> só retornará uma linha de cada vez.

Eu acreditou003Cctrl-d> Devido ao seu $/ configuração (como alguém apontou <> lê do stdin, mas acho que você já sabe disso e o está usando para regular a saída).

Se você realmente deseja regular a saída com 'Return', precisa fazer mais com $/ no loop.

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

Outras dicas

Eu acho que você está esperando esta linha

local $/ = "";

para mudar o comportamento de

<DATA>

continuar lendo até o final dos dados.

Mas na verdade é preciso algo assim

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

para ativar Modo Slurp (e para conter esse modo no escopo dentro do {curlys}).

De fato, está dizendo "Esqueça de pensar em Newlines como o marcador de final de recorde",

Além disso ... há um Tie Fighter no seu código!

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

Esse rapaz vai ler de Stdin, não a partir de dados - é isso que você quer?

Usar <> dessa maneira (interativamente) no modo de parágrafo será confuso. Não retornará quando você acertar "Return"; Em vez disso, ele lerá até obter uma linha não vazia (o início de um parágrafo) e depois leia até obter uma linha vazia (o final desse parágrafo) e continue lendo até obter uma linha não vazia (o início do parágrafo seguinte - que será tamponado, não devolvido), para que ele saiba que é descartado linhas vazias extras.

Talvez você deva estar usando:

local $/ = "\n"; <>

No final do seu loop. Ou talvez posix :: getchar ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top