2012-01-09 2 views
5

Ho un esempio di un programma che crea un array e quindi tenta di assegnare il valore di tale array più volte in un altro array come array multidimensionale.L'assegnazione dell'array Powershell assegna una variabile, non un valore?

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

Il risultato è:

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

Quindi, in questo esempio, la variabile è effettivamente indicando alla variabile originale. Questo è un comportamento molto inaspettato. È piuttosto pulito che si possa fare questo, anche se non ho mai usato i sindacati così tanto nella mia programmazione in C. Ma mi piacerebbe un modo per fare solo l'assegnazione del valore, non della variabile.

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

Credo che funzionerebbe, ma qualcosa mi dice che potrebbe esserci qualcosa di un po 'più elegante di quello.

Grazie per l'input.

Questo è PowerShell 2.0 con Windows 7 a 64 bit.

risposta

4

Per assegnare i valori di $a a $b anziché il riferimento a $a, è possibile racchiudere la variabile in $(). Qualsiasi cosa in $() viene valutata prima di utilizzarla nel comando, quindi $($a) equivale 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

Grazie. Che funzioni. Semplicemente non capisco perché un'istanza di $ a = $ b fornisce il valore e un'altra istanza fornisce il riferimento. Soprattutto quando non c'è alcuna garanzia che tu possa ottenere quando $ b potrebbe essere qualsiasi cosa. – bytehead

+2

Non è specifico per PowerShell; è il modo in cui .NET gestisce l'allocazione della memoria per Classi (per riferimento) rispetto a Strutture (per valore). I valori numerici (int, double, ecc.) Sono anche in base al valore. C'è una buona spiegazione a http://www.albahari.com/valuevsreftypes.aspx. E da Microsoft http://msdn.microsoft.com/en-us/library/t63sy5hs(v=VS.100).aspx – Rynant

+0

Grazie. Più lettura sul mucchio. – bytehead

1

Fare attenzione in PowerShell "," non è l'operatore di enumerazione, ma un operatore di array. La cosa si presenti come multidimensionale array è in realtà una serie di array, che troverete qui sotto la definizione di un array multidimensionale:

$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 
>> } 
>> } 

Tutto funziona qui come $b è un array di riferimento.

+0

Stavo cercando di utilizzare veri array multidimensionali, ma stavano lanciando l'uccello quando stavo cercando di usarli. Evidentemente ho ancora modo di imparare a conoscere i dettagli. Una serie di matrici funziona per quello che sto facendo, infatti, stavo pensando solo a usare un array piatto. – bytehead

+0

Un array di array funziona per quello che sto facendo. Da un ex programmatore C, una serie di array bidimensionali, bidimensionali, è lo stesso per me. Questo ha ancora il problema di assegnarlo a $ b. È ancora per riferimento. L'utilizzo di $ b = $ ($ a), e poi di $ b [0,2] = 3 mi dà l'assegnazione di Array a [0,2] fallita perché l'assegnazione a slice non è supportata. errore. Ciò non accade nel mio esempio. E io odio che entra aggiunge solo il commento, e la finestra di cinque minuti per la modifica fa schifo. Sto solo dicendo N00b qui. – bytehead