2013-10-20 5 views
-1

왜 perl 스크립트는 $ a = 3 및 $ b = 5에 대한 모든 행 (1 - 14)을 인쇄합니까? 내가 변경하는 경우 "경우 (내 $ NUM = $ A .. $ B)"를 "경우에 (내 $ 인분은 = 3 .. 5)"이 (예상대로)Perl 스칼라 범위 연산자

1 3

나를 준다 플립 플롭 연산자는 정수 피연산자 주어지면 2~4

3E0 5

#!/usr/bin/perl 
$a=3; 
$b=5; 
while (<DATA>) { 
    if (my $num = $a .. $b) { 
     print $num,"\t", $_; 
    } 
} 
__DATA__ 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 

답변

6

, 내재적 그래서 3..5 실제로 (($.==3) .. ($.==5))이다 $. (현재 행 번호)로 비교하는 것을 의미한다. 변수를 사용하는 경우 명시 적으로 비교를 수행해야합니다.

그래서 :

#!/usr/bin/perl 
use strict; 
use warnings; 
my $first_line = 3; 
my $last_line = 5; 
while (<DATA>) { 
    if (my $num = ($first_line==$.) .. ($last_line==$.)) { 
     print $num,"\t", $_; 
    } 
} 

그것은 버그가 아닙니다. 그것은 당신이 그것을 단지 3..5로 축약 할 수있게하는 의도적 인 것입니다. 임의의 부울 표현식 (예 : 3 ../ last/3 행에서 "last"포함 행까지 일치시킬 수 있음)을 사용할 수 있기 때문에 다른 것들을 사용할 수없고 행 번호라고 가정합니다.

http://perldoc.perl.org/perlop.html#Range-Operators

: 스칼라 문맥에서

는 ".."부울 값을 반환합니다. 연산자는 플립 플롭처럼 쌍 안정이며 sed, awk 및 다양한 편집기의 라인 범위 (쉼표) 연산자를 에뮬레이션합니다. 각 ".."연산자는 심지어 자신을 포함하는 서브 루틴 호출을 통해 자체 부울 상태를 유지합니다. 왼쪽 피연산자가 거짓이면 거짓입니다. 왼쪽 피연산자가 참이면 범위 연산자는 오른쪽 피연산자가 참이 될 때까지 true로 유지 된 후 범위 연산자가 다시 거짓이됩니다. ... 스칼라 ".."의 피연산자 중 하나가 상수 표현 인 경우 해당 피연산자는 현재 입력 행 번호 ($. 변수)와 같으면 true로 간주됩니다.