- 리스트 컨택스트
- 좌변부터 우변까지 1씩 증가하는 리스트를 반환
- 좌변값이 우변보다 클 경우는 빈 리스트 반환
- 예:
foreach(1..10)
('A' .. 'Z')
@z2 = ('01' .. '31')
- 스칼라 컨택스트
- 부울린 값 반환
- 상태값을 유지
- 처음에는 거짓
- 좌변이 참이 되면 그 때부터는 참
- 우편이 참이 되면 그 다음부터 다시 거짓
- 연산자 상태가 거짓인 동안에는 우변은 검사조차 되지 않는다. 마찬가지로 상태가 참인 동안은 좌변은 검사되지 않는다.
-
..
와 ...
의 차이:
-
..
를 사용할 경우, 좌변이 참이 되어 연산자 상태가 참이 되는 그 시점에 우변도 검사한다. 즉 참이 되자마자 곧바로 다시 거짓이 될 수도 있다 (이 때 반환하는 건 참이다. 즉 한 번은 참을 반환한다.)
-
...
를 사용할 경우는 연산자가 참이 되는 시점에서는 우변은 검사하지 않고, 그 다음 검사부터 우변을 검사한다.
- 리턴값
- 거짓을 반환할 때는 빈 스트링을 반환
- 참을 반환할 때는 1부터 시작해서 매 반환 때마다 1씩 증가하는 숫자를 반환 (즉 "몇 번째 참이 반복되고 있는지" 셀 수 있다)
- 마지막으로 참을 반환할 때는 숫자 뒤에 "E0"을 붙여서 반환한다. 숫자값에 영향을 주지 않으면서 사용자가 마지막임을 체크할 수 있다.
- 좌변과 우변이 다 상수식이라면, "현재 입력 행번호
$.
" 변수가 그 상수식과 같은지(==
)를 검사한다.
- 주의: 각 .. 연산자는 자신의 상태값을 계속 유지하며, 서브루틴 안에 들어 있거나 루프 안에 있더라도 그에 무관하게 값이 유지된다.
- 참고: 참을 반환할 때 반환값의 특성(1부터 시작하여 증가하며, 마지막에는 "E0"이 끝에 붙는)을 사용하여, 상태값을 토글하는 라인(처음 참이 되거나 마지막으로 참이 되는)을 제외하거나 기타 정교한 조작을 할 수도 있다.
sub left {
my $n = shift;
print " (left) ";
return ( $n == 3 || $n == 8 );
}
sub right {
my $n = shift;
print " (right) ";
return ( $n == 5 || $n == 9 );
}
print "use ..\n";
foreach my $n ( 1 .. 10 ) {
print "$n : ";
my $r = ( left($n) .. right($n) );
print "[$r]\n";
}
print "use ...\n";
foreach my $n ( 1 .. 10 ) {
print "$n : ";
my $r = ( left($n) ... right($n) );
print "[$r]\n";
}
위 코드의 실행 결과:
use ..
1 : (left) []
2 : (left) []
3 : (left) (right) [1] <-- 참이 된 직후에 우변 역시 검사
4 : (right) [2]
5 : (right) [3E0]
6 : (left) []
7 : (left) []
8 : (left) (right) [1] <-- 참이 된 직후에 우변 역시 검사
9 : (right) [2E0]
10 : (left) []
use ...
1 : (left) []
2 : (left) []
3 : (left) [1] <-- 참이 된 직후에는 우변은 검사하지 않음
4 : (right) [2]
5 : (right) [3E0]
6 : (left) []
7 : (left) []
8 : (left) [1] <-- 참이 된 직후에는 우변은 검사하지 않음
9 : (right) [2E0]
10 : (left) []
컴퓨터분류 Perl