2009-11-27 5 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

첫 번째 스크립트에서 $/변수를 기본값 "\ n"으로 설정하면 <DATA>은 한 번에 한 줄만 반환합니다.

나는 그것을 다른 사람이 지적 < >는 (설정/인해 $로 오히려 < Ctrl-D를 >에 '복귀'만에 읽기를 종료하지 않습니다 단지의 두 번째 스크립트는 원하는 것을 믿는다 밖으로 < > STDIN에서 읽습니다.하지만 당신은 이미 그것을 알고 있다고 생각하고 출력을 조절하는 데 사용하고 있습니다.)

'return'을 사용하여 출력을 조정하려는 경우 루프에서 $ /를 사용하여 더 많은 작업을 수행해야합니다. <를 사용

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

나는'{$/= "\ n"; <>}' –

3

난 당신이 데이터가 끝날 때까지 읽기를 계속

<DATA> 

의 동작을 변경하려면이 라인

local $/ = ""; 

을 기다리고있어 같아요.

는하지만 사실 그것은 slurp mode 수 있도록 (그리고 {curlys} 내부의 범위에 해당 모드를 포함)이

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

같은 것을합니다. 사실상

은 그 외에

"의 끝 기록 마커로 줄 바꿈을 생각하고 잊어"말하는 ... 코드에서 tie fighter가있다!

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

이 작은 남자는 DATA가 아니라 STDIN에서 읽습니다. 정말 원하는 것입니까?

+1

실제로 "Perl"타이 전투기 "는"<=> "이며 우리는이를"우주선 운영자 "라고도합니다. –

+0

나는 알고있다. 그러나 <>는 너무 가깝다. 나의 두려운 금요일의 두뇌는 그 작은 세부 사항을 뛰어 넘을 수 없었다. –

+5

Methinks 우리는 '<-o->'연산자를 발명해야합니다. –

2

가> 단락 모드에서 그런 식으로는 (대화 형) 혼란 스러울 것입니다. "return"을 눌렀을 때 반환되지 않습니다. 대신 빈 행 (단락의 시작)이 될 때까지 읽은 다음 빈 행 (해당 단의 끝)이 될 때까지 읽은 다음 비어 있지 않은 행 (start 다음 단락의 - 버퍼링되고 리턴되지 않음), 여분의 빈 줄은 무시됩니다.

아마 당신은 사용해야합니다 :

local $/ = "\n"; <> 

을 대신 루프의 끝에서. 또는 아마도 POSIX :: getchar().

관련 문제