2

Perlでは、次のように複数の変数をインスタンス化することができます。

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

同じ方法で複数の変数値を再割り当てすることもできます。

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

ただし、plus equals演算子を使用して同じことを行おうとすると、

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

のみ$cが適切に追加され、他の変数は元の値のままになります。これはPerlで可能であるはずのことですか、それとも部分的に偶然に機能していて、実際にはそのようには機能しませんか?後者が当てはまる場合、これを1行で行う方法はありますか?

4

2 に答える 2

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.

これを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]};
于 2012-10-02T03:23:36.407 に答える
6

のロングハンドバージョンは+=機能するはずです:

($a,$b,$c) = ($a+7,$b+8,$c+9)
于 2012-10-02T03:19:44.583 に答える