2012-10-02 3 views
2

В Perl можно создать несколько переменных следующим образом:Проводите + = в одной строке Perl

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

Также можно переназначить множественные значения переменных таким же образом:

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

Однако, когда я пытаюсь сделать то же самое с плюсом равна оператору,

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

только $c правильно добавлен, а остальные переменные остаются их первоначальным значением. Это что-то, что должно быть возможно в 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. 

есть способ для этого в одной строке?

Несомненно, их бесконечно много. Вот три:

$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, но я не думаю, что это то, что вы имеете в виду. Возможно, вы пропустили реферирование? (Переключено на $ x, $ y, $ z) – ikegami

6

обыкновенное письмо версия += должно работать:

($a,$b,$c) = ($a+7,$b+8,$c+9) 
Смежные вопросы