1oo WGUiSW – 1o lat!

już wkrótce SETNE [1oo] spotkanie WGUiSW. 1o lat spotkań. zacna liczba. chętnie podzielę się zaproszeniem, które otrzymałem (:

każdy, kto uczestniczy w spotkaniach – aktywnie, czy jako słuchacz – jest ważną częścią społeczności. o tym, że ta działalność jest ważna świadczy fakt, że niestrudzenie funkcjonuje od dekady i wciąż nie braqje ani słuchaczy ani prezenterów.

serdecznie zapraszam na kolejne, setne już spotkanie, na którym znajdzie się czas na wspominki i celebrację tej znakomitej rocznicy!

PS. nie zapomnijcie zapisać się na meetup żeby nie mieć problemów z wejściem!

eN.

przekazanie zmiennych

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.