2014-06-08 3 views
2
내가 another question보고이 잠시 나타났습니다

...펄 플립 플롭 연산자 및 라인 번호

나는이 같은 스크립트가있는 경우 :

while (<>) { 
    print if 5 .. undef; 
} 

그것은 라인 1..4을 건너 뛰고 다음 나머지를 인쇄 파일의 나는이 시도하지만 경우 :

그것은 사람이 이유를 설명 할 수 라인 1. 에서 인쇄
my $start_line = 5; 
while (<>) { 
    print if $start_line .. undef; 
} 

?

실제로 나는 왜 첫번째 것이 작동하는지조차 모르겠습니다.

my $start = 5; 
while (<>) { 
    print if $. == $start .. undef; 
} 

그래서 첫 번째 버전은 마술 줄 번호입니다 $.을 사용

흠이에 더보고 나는이 작품 것을 발견했다. 하지만 변수로 인해 왜 실패하는지 나는 모른다.

답변

9

플립 플롭에서 베어 메이트를 사용하는 것은 라인 카운트 변수 인 $.에 대한 테스트로 처리됩니다. perldoc perlop에서 :

스칼라 ".."의 피연산자는 현재 입력 라인 수 ($. 변수 내지 ==) 같으면 피연산자가 진정한 것으로 간주된다하는 상수 식 경우. 그렇지 상수 표현식 같이

print if $. == 5 .. undef; 

같은 스칼라 변수에 대한 사실이 아니다 :

그래서

print if 5 .. undef; 

은은 "속기"입니다. 이것이 $.에 대해 테스트되지 않은 이유입니다.

+1

Perl은 때때로 언어보다 '마법 맞춤법 책'에 가깝습니다. –

+2

@ JohnC : 그것은 영어에 대해서조차 더 진실하다 :) – Zaid