Como faço para ler parágrafos de cada vez com Perl?
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
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 ().