Массив Powershell присваивает переменную, а не значение? - PullRequest
5 голосов
/ 09 января 2012

У меня есть пример программы, которая создает массив, а затем пытается присвоить значение этого массива несколько раз в другой массив как многомерный массив.

$a =@(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

Таким образом, в этом случае переменная фактически указывает на исходную переменную.Это очень неожиданное поведение.Довольно неплохо, что это можно сделать, хотя я никогда не использовал так много союзов в своем программировании на Си.Но я бы хотел на самом деле просто сделать присвоение значения, а не переменной.

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

Я думаю, что это сработало бы, но что-то подсказывает мне, что может быть что-то более элегантное, чемчто.

Спасибо за ввод.

Это PowerShell 2.0 под 64-битной Windows 7.

Ответы [ 2 ]

4 голосов
/ 09 января 2012

Чтобы присвоить значения $a для $b вместо ссылки на $a, вы можете заключить переменную в $().Все, что в $(), оценивается перед использованием в команде, поэтому $($a) эквивалентно 0, 0, 0.

$a =@(0,0,0)
$b = @($($a),$($a),$($a))
$b[1][2]=2
$b
'$a is not changed.'
$a
1 голос
/ 09 января 2012

Будьте осторожны в 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 является справочным массивом.

...