2012-01-09 12 views
5

私は配列を作成し、その配列の値を別の配列に多次元配列として複数回割り当てようとするプログラムの例を持っています。Powershell配列の代入は値ではなく変数を代入しますか?

$a [email protected](0,0,0) 
$b = @($a,$a,$a) 
$b[1][2]=2 
$b 
'And $a is changed too:' 
$a 

出力である:

PS E:\Workarea> .\what.ps1 
0 
0 
2 
0 
0 
2 
0 
0 
2 
And $a is changed too: 
0 
0 
2 

したがって、この例では、変数は、実際には、元の変数を指しています。これは非常に予期しない動作です。私のCプログラミングではそれほど労組を使用したことはありませんでしたが、これはむしろきちんとしています。しかし、私は実際に変数の値ではなく、値の割り当てを行う方法が欲しいです。

$b = @($a.clone(),$a.clone(),$a.clone()) 

私はうまくいくと思いますが、何かがそれよりもう少しエレガントな何かがあるかもしれないことを私に伝えます。

ありがとうございます。

これはWindows 7 64ビット版のPowerShell 2.0です。

答えて

4

$aの値を$aの代わりに$bに割り当てる場合は、変数を$()にラップすることができます。 $()の値はコマンドで使用する前に評価されるため、$($a)0, 0, 0に相当します。

$a [email protected](0,0,0) 
$b = @($($a),$($a),$($a)) 
$b[1][2]=2 
$b 
'$a is not changed.' 
$a 
+0

ありがとうございます。それは動作します。 なぜ私は$ a = $ bのインスタンスがあなたに値を与え、別のインスタンスがあなたに参照を与えるのか理解できません。特に$ bが何かになる可能性があるという保証はありません。 – bytehead

+2

これはPowerShellに固有の問題ではありません。これは.NETがClasses(参照による)とStructs(値による)のメモリ割り当てを処理する方法です。数値(int、doubleなど)も値です。 http://www.albahari.com/valuevsreftypes.aspxには良い説明があります。 Microsoftからhttp://msdn.microsoft.com/en-us/library/t63sy5hs(v=VS.100).aspx – Rynant

+0

ありがとうございます。杭についてもっと読む。 – bytehead

1

PowerShellで注意してください '、'は列挙演算子ではなく、配列演算子です。あなたに多次元配列は、実際には、配列の配列で提示する事、あなたが多次元配列の定義の下に、ここで見つけることができます:

$a= new-object ‘object[,]’ 3,3 
$a[0,2]=3 
PS > for ($i=0;$i -lt 3;$i++) 
>> { 
>> for($j=0;$j -lt 3;$j++) 
>> { 
>> $a[$i,$j]=$i+$j 
>> } 
>> } 

すべてが$bとしてここで働いは、参照の配列です。

+0

私は真の多次元配列を使用しようとしていましたが、使用しようとしているときに鳥をひっくり返していました。明らかに、私はまだインとアウトを学ぶための方法があります。配列の配列は、私がやっていることに作用します。実際、フラットな配列を使うことを考えていました。 – bytehead

+0

配列の配列は、私がやっていることに対して機能します。以前のCプログラマ、一次元、二次元、配列の配列から、私にとってはまったく同じです。 これにも$ bに割り当てる問題があります。まだ参考になっています。 $ b = $($ a)を使用し、$ b [0,2] = 3を使用すると、スライスへの割り当てがサポートされていないため、[0,2]への配列代入が失敗しました。エラー。 これは私の例では起こりません。 そして私はちょうどコメントを追加する入力が嫌い、編集のための5分の窓は吸う。ただ言って。ここにN00b。 – bytehead

関連する問題