2009-11-27 4 views
1

Когда я пишуКак читать абзацы одновременно с Perl?

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

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

после каждого «возвращения» Я получаю одну строку.

Почему я не могу получить следующий сценарий после каждого «возврата» одного абзаца?

#!/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 

ответ

4

В вашем первом скрипте с переменной $/variable, установленной по умолчанию «\ n», <DATA> будет возвращать только одну строку за раз.

Я считаю, что второй сценарий делает то, что вы хотите, это просто, что < > не прекращает чтение на «возвращении», а на < Ctrl-D > из-за вашего $/настройки (как кто-то другой указал out < > читает от STDIN, но я думаю, вы уже знаете это и используете его для регулирования вывода).

Если вы действительно хотите отрегулировать вывод с помощью «return», вам нужно сделать больше с помощью $/в цикле.

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

Я бы использовал '{$/=" \ n "; <>}' –

3

Я предполагаю, что вы ожидаете эту линию

local $/ = ""; 

изменить поведение

<DATA> 

чтобы продолжать читать до конца данных.

Но на самом деле он принимает что-то вроде этого

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

для включения slurp mode (и содержать этот режим с областью внутри {} curlys).

По сути, это говорит «забыть о размышлении о новой строкой в ​​качестве конца-записи маркеров»,

Кроме того, ... есть в вашем коде tie fighter!

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

Этот маленький парень будет читать от STDIN, а не от DATA - это действительно то, что вы хотите?

+1

На самом деле, «связующий истребитель» Perl - это «<=>», который мы также иногда называем «оператором космического корабля». –

+0

Я знаю, но <> настолько близок, что мой ухмыляющийся пятничный мозг не удержался от того, чтобы перескакивать эту мелочь. –

+5

Мне кажется, нам нужно придумать '<-o->' оператор. –

2

< Использование> таким образом (в интерактивном режиме) в режиме пункта будет вводить в заблуждение. Он не вернется, когда вы нажмете «return»; вместо этого он будет читать до тех пор, пока не получит непустую строку (начало абзаца), а затем прочитает, пока не получит пустую строку (конец этого абзаца), затем продолжите чтение, пока не получит непустую строку (начало следующего абзаца - который будет буферизован, а не возвращен), поэтому он знает, что он отбрасывает лишние пустые строки.

Может быть, вы должны использовать:

local $/ = "\n"; <> 

в конце вашего цикла вместо этого. Или возможно POSIX :: getchar().