PowerShellのハッシュ
PowerShellでは配列の仲間として連想配列、つまりハッシュテーブルを使用することができる。バージョン3以降ではPSObjectを簡単に生成する方法でもあるため配列と同じくらい頻繁に利用される。
連想配列というのは、名前と値のペアから構成されるものだ。名前のことをKeyという。PowerShellで連想配列を作成するには特殊な演算子を使用する。
$a = @{}
この波かっこの中へKeyとなる名前と値をイコール記号で結びつけるとハッシュリテラルを作成することができる。
$a = @{ name = "nalulabo" }
Keyはこのハッシュ中では一意(ユニーク)な名前となるため、同じ名前でデータを与えると上書きされる。辞書方式のものでは上書きではなくエラーにするタイプのプログラミング言語があるのだが、PowerShellでは単に上書きされてしまう。
あるKeyのもつ値へアクセスするには配列のように参照を行う演算子 [ ] を利用してアクセスする方法とオブジェクトのように参照を行う演算子「.」を利用してアクセスする方法がある。
$a["name"] # => nalulabo
$a.name # => nalulabo
$a."name" # => nalulabo
文字列を与えてアクセスする場合はループの中で変数展開を利用できるため、用途に応じて使い分けるとよいだろう。
ハッシュの操作
ハッシュへKeyと値のペアを追加するにはAddメソッドを利用する。ここは演算子が用意されていない。この違いはPowerShellのハッシュがSystem.Hashtableそのものだからということがあるだろう。
$a.Add("aaa", 10) # => @{ name = "nalulabo"; aaa = 10 }
逆のKeyの削除はRemoveメソッドを利用する。このときは名前のみで大丈夫だ。
$a.Remove("aaa") # => @{ name = "nalulabo" }
Keyの値を更新するときは値へアクセスするときと同様にして、イコール記号で値だけを渡す。こうすることで更新される。
$a.name = "powershell"
上書きをしたくない場合もあるだろう。そうしたとき、すでに登録したいKeyがハッシュ内に登録されているか知る方法がある。これもメソッドでContainsメソッド、ContainsKeyメソッドだ。値が登録されているかどうかはContainsValueメソッドを利用する。
$a.Contains("name") # => True
$a.ContainsValue("nalulabo") # => True
そのほか、ハッシュ内の要素をすべて削除するにはClearメソッドを利用する。
PSObjectをつくる
PowerShellではバージョン5になるまで、オブジェクト指向的なことをおこなうにはPSObjectを利用するほかなかった。バージョン2まではAdd-Memberコマンドレットを利用することでカスタムオブジェクトを作成してプロパティやメソッドを追加していた。一方で、単なるデータだけのオブジェクトをつくりたいときにこの方法は非常に面倒だった。バージョン3以降ではデータ型を変換する演算子によって型を指定することで簡単にPSObjectにまとめることができるようになった。
$o = [pscustomobject]@{ id = 123; name = "nalulabo" }
つくることができるようにはなるが、ハッシュのままのほうが都合がよいことも多いので用途に応じて使い分けをしたい。なお、PSObjectについては後述する。