przekazanie zmiennej
to w jaki sposób przekazywane są zmienne – przez wartość, czy przez referencję – znacząco wpływa na to, jak łatwo/trudno będzie potem pisać skrypt, oraz żeby nie zrobić sobie krzywdy. oto jak to działa w PS.
najpierw najprostszy możliwy przykład:
$a=1 $b=$a $b=2 $a $a=3 $b
co pojawi się na ekranie? będzie to:
1 2
czyli zmienna była przekazana przez wartość – $a i $b są niezależnymi zmiennymi, modyfikacja jednej, nie wpływa na drugą.
ALE
inny przykład – tym razem zmienną jest tablica:
$a=@('1','ala') $b=$a $b[0]='kot' $a
i na ekranie pojawi się:
kot ala
a to oznacza, że $b=$a jest przekazaniem referencji a nie kopią zmiennej. to hiper ważne, bo może zarówno pomóc ale i nieźle rozwalić całą logikę skryptu.
bardziej złożony scenariusz, gdzie takie przekazanie jest przydatne: „jest długa lista elementów. dla tych elementów, które nie mają wartości, trzeba wykonać jakąś [czasochłonną] operację, następnie trzeba wyeksportować całą listę”
przykładowa lista [list.csv]
user,value a,1 b,2 c, d,5 e,8 f, g,3 h,
prosty kawałek skryptu [test-reference.ps1]
$data=import-csv .\list.csv $partialData=$data|?{-not $_.value } foreach($d in $partialData) { $d.value='10' } $data
podstawowe pytanie: co zwróci $data?
cały myk polega na tym, że:
- importuję wszystkie dane.
- tworzę zmienną stanowiącą ich podzbiór czyli elementy bez wartości [$data przefiltrowane -not $_.value]
- wykonuję operacje na podzbiorze – foreach($d in $partialData)
- i na końcu chcę wszystkie wartości, a nie tylko część, wyeksportować.
pomimo, że na końcu nie ma nigdzie przepisania $partialData z powrotem do $data, wynik jest:
user value ---- ----- a 1 b 2 c 10 d 5 e 8 f 10 g 3 h 10
dzięki temu, że $partialData tylko wskazuje na elementy tej samej tablicy, operacje wykonywały się bezpośrednio. nie muszę nic kombinować i mogę teraz zrobić po prostu „$data|export-csv”.
czasem jednak scenariusz może być zupełnie odwrotny – chcemy zrobić kopię danych i na nich się pobawić, nie wpływając na 'master copy’. w takim przypadq można użyć kilq metod – np. klonowania:
$a=@('1','ala') $b=$a.clone() $b[0]='kot' $a
eN.