2012-10-02 1 views
2

한줄 :수행 여러 + = 그렇게 같은 여러 변수를 초기화 할 수있다 펄 펄

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

그것을 여러 변수 값을 동일하게 재 할당하는 것이 가능하다 :

($a, $b, $c) = (4,5,6); 

는 그러나, 나는 더하기과 같은 일을 할 때 단지

($a, $b, $c) += (7,8,9); 

, 연산자와 동일이 제대로 추가되고 다른 변수는 원래 값으로 유지됩니다. Perl에서 가능해야하는 것입니까, 아니면 우연히 부분적으로 만 작동하고 실제로 그렇게 작동하지 않습니까? 후자가 사실이라면 한 줄에이 방법이 있습니까?

+0

벡터 수학을 할 CPAN의 모듈이 많이 있습니다. –

답변

12

는 단지 부분적 사고로 작업하고 정말 그런 식으로 작동하지 않습니다입니까?

예.

스칼라 컨텍스트의 목록 연산자는 각 피연산자를 차례로 계산하고 마지막 피연산자가 계산 한 값을 반환합니다. 그래서 당신은 기본적으로하고있는 다음

do { $a; $b; $c } += do { 7; 8; 9 }; 

이유는 다음

Useless use of a constant (7) in void context at -e line 1. 
Useless use of a constant (8) in void context at -e line 1. 
Useless use of a variable in void context at -e line 1. 
Useless use of a variable in void context at -e line 1. 

한 줄이에에 방법이를 얻고있어 그?

물론 무한대가 있습니다. 3 가지가 있습니다 :

$a += 7; $b += 8; $c += 9; 

${$_->[0]} += $_->[1] for [\$a,7],[\$b,8],[\$c,9]; 

use List::MoreUtils qw(pairwise); 
pairwise { $$a += $b; } @{[\$x,\$y,\$z]}, @{[7,8,9]}; 
+0

실제로 그 일을 설명해 주셔서 감사합니다. 나는 그 얼굴을보고 그것을 논리적으로 정확하다고 생각했습니다. – fishpen0

+0

@ikegami : 세 번째 옵션을 확인하십시오. 나는 그것이 ($ x, $ y, $ z) 쌍 = {$ a + $ b} @ {[$ x, $ y, $ z]}, @ {[7, 8, 9]} 일 필요가 있다고 생각한다. ;'. 그렇지 않으면 읽기 전용 오류를 수정하거나 문자열 ("...")을 참조로 사용할 수 없습니다. 엄격한 참조를 사용하는지 여부에 따라 오류가 발생합니다. – DavidO

+0

@DavidO, 아니요, $ a, $ b, $ c를 재사용해도 괜찮습니다.하지만 그게 무슨 뜻인지는 생각하지 않습니다. 아마도 ref-taking slashes를 그리워 했습니까? ($ x, $ y, $ z로 변경) – ikegami

6

+=의 긴 형식 버전은 작동합니다 :

($a,$b,$c) = ($a+7,$b+8,$c+9)