要素が2つ以上の配列の作り方とアクセス方法

PowerShell Coreはデータ型として配列を提供している。PowerShell Coreで配列を作るには、次のようにカンマ区切りで並べて変数を定義すればよい。PowerShell Coreの配列は任意のオブジェクトを取ることができ、同一のオブジェクト型である必要がないという特徴もある。

配列へのアクセスは0からはじまるようになっており、10個の配列を作ったなら$v[0]から$v[9]といったアクセスを行う。配列にいくつ要素が含まれているかはLengthプロパティで参照できる。

配列の作成と参照

PS /Users/daichi> $v = 1,2,3,4,5,"a","b","c","d","e"
PS /Users/daichi> $v
1
2
3
4
5
a
b
c
d
e
PS /Users/daichi> $v[0]
1
PS /Users/daichi> $v[1]
2
PS /Users/daichi> $v[2]
3
PS /Users/daichi> $v[3]
4
PS /Users/daichi> $v[4]
5
PS /Users/daichi> $v[5]
a
PS /Users/daichi> $v[6]
b
PS /Users/daichi> $v[7]
c
PS /Users/daichi> $v[8]
d
PS /Users/daichi> $v[9]
e
PS /Users/daichi> $v[10]
PS /Users/daichi> $v[11]
PS /Users/daichi> $v.Length
10
PS /Users/daichi>

このあたりの記述はほかのプログラミング言語と似ているので、それほど違和感はないはずだ。

要素が1つの配列を作る方法

カンマ区切りで配列を定義するということは、要素がひとつしかない配列は作れないことになる。次のようにカンマを含まないで変数を定義すると、配列ではなく変数として処理されることがわかる。

要素が1つだとカンマ区切り定義で配列にすることができない

PS /Users/daichi> $v = 0
PS /Users/daichi> $v.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType


PS /Users/daichi>

 

この場合には@()という表記を使う。@()で囲うことで要素がひとつであっても配列として定義することができる。

@()を使えば要素がひとつの配列を作成できる

/Users/daichi> $v = @(0)
PS /Users/daichi> $v.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array


PS /Users/daichi> $v.Length
1
PS /Users/daichi>

 

PowerShell Coreでは変数にもLengthというプロパティが用意されているため、変数であっても配列のように見せかけることができる。すなわち、変数でも$v[0]のようにインデックスを指定したアクセスができるようになっている。

これはコーディング上のエラーが発生することを減らすための機能だが、配列として利用したい場合には最初から配列として用意しておいた方が後々問題になることが少ないだろう。

@()は配列を作成する方法として覚えておきたい。もちろん2つ以上の要素の配列も@()で作成できる。

要素が0の配列を作る方法

@()に何の値も指定しないと、要素が0の配列を作ることができる。

要素が0の配列

PS /Users/daichi> $v = @()
PS /Users/daichi> $v.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array


PS /Users/daichi> $v.Length
0
PS /Users/daichi>

つまり、@()の記述を使うことで要素が0以上の配列を作ることができる。利便性からカンマ区切りだけで配列を作りがちだが、きっちりコーディングしたいなら@()を使うようにした方がトラブルを減らせるかもしれない。

連続値を指定して配列を作る方法

次のように..で範囲を指定して配列を作ることもできる。たとえば1..5という表記なら1,2,3,4,5という表記と同じ意味になるし、”a”..”e”という表記なら”a”,”b”,”c”,”d”,”e”という表記と同じ意味になる。

値の範囲を指定して配列を作成

PS /Users/daichi> $v = 1..5
PS /Users/daichi> $v
1
2
3
4
5
PS /Users/daichi> $v = "a".."e"
PS /Users/daichi> $v
a
b
c
d
e
PS /Users/daichi>

 

型を固定して配列を作成

変数の時と同じように、配列でも型を固定することができる。

たとえば文字列だけの配列にしたい場合には[string[]]$vのように変数名を定義すればよい。

次の例では文字列型に固定しているため、1..5という整数の配列として用意しているが、代入される段階で文字列に変換されるようになる。

型を固定して配列を作成

PS /Users/daichi> [string[]]$v = 1..5
PS /Users/daichi> $v
1
2
3
4
5
PS /Users/daichi> $v[0] + $v[1] + $v[2]
123
PS /Users/daichi>

この場合、文字列として保持されているため、+で足し算を行うと数字の演算ではなく文字列の結合処理が行われる。$v[0]+$v[1]+$v[2]は1+2+3という演算を実施しているように見えるが、型が文字列なので実際には”1”+”2”+”3”という演算になっており、文字列の結合が行われて結果として123が出力されている。

配列の中身をクリア

配列にはClear()というメソッドが用意されており、このメソッドを実行すると配列の中身をクリアすることができる。

Clear()メソッドで配列の中身をクリア

PS /Users/daichi> $v = 1..5
PS /Users/daichi> $v
1
2
3
4
5
PS /Users/daichi> $v.Clear()
PS /Users/daichi> $v.Length
5
PS /Users/daichi>

しかし、配列そのものを削除するわけではないので、配列が保持できる要素の個数はそのままになっている。配列そのものを削除する場合にはRemove-Variableコマンドレットを使用する。

このあたりが配列の主な機能だ。

配列はPowerShell Coreで基本的な機能となっている。自分で使うことはないとしても、配列を使ったPowerShell Coreのスクリプトを読む機会はあるはずだ。どのように読めばよいかわかるくらいにはなっておきたい。

参考資料