2011-05-14 9 views

답변

8

예. perlop에는 precedence table이 있습니다. 할당 연산자는 19 레벨이고 쉼표는 20 레벨입니다. 일반적으로 Perl의 연산자는 해당 C 연산자와 우선 순위가 같습니다 (해당 C 연산자가있는 연산자의 경우).

($a,$b,$c) = (1,2,3);을 의미하는 경우 괄호를 사용해야합니다.

2

(스칼라 컨텍스트에서 사용한) 쉼표 연산자는 여러 개의 표현식을 평가하고 마지막 표현식을 반환하기위한 튜플 구성을위한 것이 아닙니다.

Perl은 상황에 따라 다르게 처리하며, 스칼라 값, 목록, 아무 것도 기대하지 않을 경우 수행 할 작업을 결정합니다. 소개는 perldoc perldata's section on Context을 참조하십시오.

그래서, 당신이 할 경우 : 4,2,0은 스칼라 문맥에서 평가되기 때문에

perl -e '$a = (1 and 4,2,0); print"$a\n"' 

당신은 0을 얻고, 쉼표와 마지막의 결과를 리턴하는 표현식을 평가, C의 콤마 연산자처럼 동작합니다. 배열 세력 목록 컨텍스트에 할당 (추가 괄호하는 우선 순위의 문제 CJM 언급이 해결할 수있다) 때문에

perl -e '$a = (1 and @a=(4,2,0)); print"$a\n"' 

당신은, 3을 얻고, :

당신이 4,2,0을 강제하는 경우

목록의 맥락에서 평가되어야합니다 (스칼라 컨텍스트에서 and의 RHS가 됨으로써 강제되는) 스칼라 컨텍스트의 목록 값은 해당 요소의 개수입니다 (Perl의 논리 and은 다른 프로그래밍 언어 에서처럼 부울 값 대신 평가 된 마지막 표현식을 반환합니다) . CJM 말했듯이

그래서, 당신은 할 필요가 :

($a,$b,$c) = (1,2,3); 

이 우선 힘리스트 문맥을 처리 할 수 ​​있습니다.

공지 간의 차이 : 콤마 연산자 스칼라 문맥에서 평가

$ perl -e '$a,$b,$c = (7,6,8); print "$a $b $c\n"' 
8 

, 반환 제

$ perl -e '($a,$b,$c) = (7,6,8); print "$a $b $c\n"' 
7 6 8 

콤마 연산자는리스트 문맥에서 평가하고, 목록을 반환한다.

$ perl -e '$a,$b,$c =() = (7,6,8); print "$a $b $c\n"' 
3 

콤마 연산자는 목록을 반환리스트 문맥에서 평가되고, 그리스트의 소자의 수를 반환 $c 힘 스칼라 콘텍스트에 할당.