2012-02-16 3 views
12
스칼라 문맥에서리스트 할당은 오른쪽에있는 요소의 수를 반환

:목록 할당

scalar(my ($hello, $there, $world) = (7,8)); #evaluates to 2 

은 왜 오른쪽을 평가하고 2를 생산 않습니다, 대신 새로 정의 된 목록을 평가 받고 3을 되 돌리는가? $hello $there $world ($hello 7 얻는다처럼 나에게

, $there 8을 얻는다 것, 그리고 그 목록의 원소의 개수로 $world는 3 초래 그 목록은 스칼라 문맥에서 평가 undef를 가져옵니다). 그것은 그 문맥이 평가 된 표현의 일부가 반환되는 영향을 나에게 이상한 것 같다

my $greeting = (($hello, $there, $world) = (7,8)); #2 

my @greeting = (($hello, $there, $world) = (7,8)); 
my $greeting_length = @greeting; #3 
이 (할당 연산자 섹션의 마지막 문장) perlop의 오른쪽에있는 요소를 계산하는 문서화
+1

사실, 더는 : 왼쪽 목록은 스칼라 문맥에서 평가 된 것 인 경우, 값은 undef''없을 것이다. 목록이 배열이 아닙니다. – darch

+0

@ darch, 그건 의미가 없습니다. '($ hello, $ there, $ world)'(와'(7,8)')은 스칼라 문맥에서'$ hello, $ there, $ world = = '에 실행할 수 없습니다. 목록 할당은 원하는 경우 3을 반환 할 수 있지만 이유가 없습니다. – ikegami

+0

필자는 "then [list ($ hello, $ there, $ world)]이 스칼라 컨텍스트에서 평가됩니다."라는 문구에 정확하게 응답했습니다. 'my ($ h, $ t, $ w) = (7, 8, undef)를 평가하십시오; 스칼라 ($ h, $ t, $ w)'와 배열이 배열이 아니라는 것을 알 수 있습니다. – darch

답변

14

:

마찬가지로 목록 컨텍스트의 목록 할당은 할당 된 lvalues의 목록을 생성하고 스칼라 컨텍스트의 목록 할당은 할당의 오른쪽에있는 표현식에 의해 생성 된 요소의 수를 반환합니다.

while (my ($key, $value) = each %hash) { ... } 

는 할당의 왼쪽에있는 요소의 수를 계산하면, 무한 될 것이라고 :

가 그런 식으로 작동하는 이유는 다음과 같은 일을 쓸 수 있도록이다 고리.

생각해 보면 왼쪽에있는 요소의 수는 오른쪽과 같거나 상수입니다 (스칼라 목록에 할당 할 때). 첫 번째 경우에는 어떤면에서 차이가 없으며 두 번째 경우에는 오른쪽면을 계산하는 것이 더 유용합니다.

반면에 목록 컨텍스트에서 할당 연산자는 왼손 목록을 반환하는데, 그 이유는 이것이 더 유용하기 때문입니다. 목록 요소를 수정하는 컨텍스트에서 사용할 경우 방금 할당 된 변수를 수정하려고합니다.

재 : 당신의 예에서 의견(7,8)는 스칼라의 긴 목록에 짧은 목록을 할당 할 때 할당 연산자는 2를 반환 이유는, 2 요소의 목록이며, 오른쪽은 아니다 할당이 발생하기 전에 undef으로 "padded out"하십시오. 대신 오른쪽 목록에서 연관된 값이없는 모든 변수가 기본값으로 재설정됩니다. 스칼라 변수의 경우는 undef입니다. 배열의 경우 빈 배열입니다. 해시는 빈 해시입니다.

+0

당신의 대답은 이해가됩니다. 왜 이런 식으로 작동하는지 이해하지만, 어떻게 작동하는지 더 흥미가 있습니다. ikegamis post에 대한 내 의견을 참조하십시오. – Brian

+0

@Brian, 목록 컨텍스트에서 왼쪽 목록을 얻지 만 스칼라 컨텍스트에서는 오른쪽 목록의 수를 얻습니다. 두 경우 모두 그것이 가장 유용한 것이기 때문입니다. 자세한 내용은 업데이트 된 답변을 참조하십시오. – cjm

+0

@Brian, Perl에는 스칼라 컨텍스트에서 목록 컨텍스트에서 반환 할 요소의 수 이외의 다른 값을 반환하는 많은 함수와 연산자가 있습니다. 함수 나 연산자가 반환 할 내용을 찾으려면 문서를 읽어야합니다. '그것은 그 문맥이 평가 된 표현의 일부가 반환되는 영향을 나에게 이상한 것 같다 : – cjm

6
측면이 평가되는 문맥 효과가 나에게 이상하게 보입니다.

그렇지 않습니다. 목록 할당 연산자의 양측 (피연산자)이 평가되고 목록 할당이 스칼라 컨텍스트 또는 목록 컨텍스트에서 평가되는지 여부는 피연산자의 평가에 영향을주지 않습니다.

목록 할당이 스칼라 컨텍스트 또는 목록 컨텍스트에서 평가되는지 여부는 반환하는 값에만 영향을줍니다.

내가 이전에 두 개의 할당 연산자와 그들이 어떻게 스칼라 및 목록 맥락에서 행동 사이의 차이를 명확하게하려고 Mini-Tutorial: Scalar vs List Assignment Operator을 만들었습니다.

+0

나는 조금 명확히하기 위해 그 문장을 편집 한'내가 그 상황이 평가 만 반환 결과에 영향을주지 않습니다 알고,하지만 난 알고 싶어 어떻게 작동하는지. 과제의 오른편이 평가되고 왼쪽 측면에 할당되면 왜 스칼라는 2를 얻게됩니까? 오른쪽은 스칼라에 할당되어야하는 3 요소 목록으로 평가됩니다. 마치 펄이 선행 규칙을 무시하고 반환해야하는 표현식 부분을 선택하기로 결정한 것과 같습니다. – Brian

+0

않는 한, 물론,의'내 @greeting = (($가, $의 세계) = 안녕하세요 $ (7,8))'안녕하세요 ($'대신'의'@의 greeting''(7,8)을 줄 것이다, $ there, $ world)'이제는 나에게 훨씬 더 의미가있다. 그러나'@ 인사말'이'($ hello, $ there, $ world)'를 얻고'$ greeting '이'(7,8)'의 결과를 얻는다면 그건 의미가 없습니다. – Brian

+0

'$ greeting '은'(7,8)'의 결과를 얻지 못합니다. 사실'$ greeting '이'(7,8)'의 결과를 얻는 것은 불가능합니다. 왜냐하면이'(7,8)'은리스트 값으로 평가되고리스트 값은 스칼라에 할당 될 수 없기 때문입니다. '@ greeting'과'$ greeting'은 목록 할당의 결과를 얻습니다. 목록 할당은 "LHS 평가 값"또는 "RHS 평가 요소 수"중 하나입니다. 당신은 다른 결과를 얻는 것이 유용 할 것이라는 이유에 대해 아무런 이유없이 다른 것을 돌려주는 것이 더 낫다는 것을 암시하는 것처럼 보입니다. – ikegami

관련 문제