Powershell(基本的なこと002_2次元配列)

■配列を使ってみる。
Powershellに関する書籍がないか図書館や本屋を探してみたけど、めぼしいものが見当たらない。Webを調べてみると、MicrosoftのサイトでPowershellドキュメントというものがあった。その中に「配列について知りたかったことのすべて」という記事があったので、それを参考に配列を試してみる。
Powershellでは、配列は@()で作成し、配列内の要素への参照は変数[番号]とする。@で作成するのは見慣れないけど、要素への参照はバッチファイルなどと同じ。配列の宣言、表示、更新のサンプルを試してみた。

################
# Array: @()
################
$data=@('111','222','333')

echo ---data[0]-------------------
$data[0]
echo ---data[1]-------------------
$data[1]
#` is escape character
echo ---data[0`,1]-------------------
$data[0,1]
echo ---data[0..2]-------------------
$data[0..2]
echo ----------------------
$subData = @('AAA','BBB')
$data[0] = $subData
echo ---data[0]-------------------
$data[0]
echo ---data[0`,1]-------------------
$data[0,1]
echo ---data[0][0]-------------------
$data[0][0]
echo ----------------------
for ($n=0; $n -lt 3; $n++) {
 echo $data[$n]
}

配列の中に配列を入れる(@('AAA', @('BBB', 'CCC', 'DDD'), 'EEE')といったこともできるようなので、2次元配列も作成できそう。オセロの石の表示を試してみた。結果の下はうまくいかなかったもの。

################
# Othello stone (〇、●) display
################
echo ●〇
echo =============================

$Othello=@(
@('_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_')
)

<#
$line=@('_','_','_','_','_','_','_','_')

$Othello=@('_','_','_','_','_','_','_','_')
for ($n=0; $n -lt 8; $n++) {
 $Othello[$n]=$line
}
#>

$Othello[3][3]='〇'
$Othello[3][4]='●'
$Othello[4][3]='●'
$Othello[4][4]='〇'

for ($n=0; $n -lt 8; $n++) {
    $Othello[$n] -join ''
}

@を入れ子にして8×8の配列を宣言。

要素8の配列を宣言後、別の要素8の配列に入れ込む(左のコードでコメントアウト<#~#>しているところ)。

オセロでの表示をいろいろと試してみたところ、うまく表示できないものがあったので、そのおぼえがきを残しておく。
上のコードでコメントアウト<#~#>しているところは、先に要素8の配列($line)を宣言し、それを別の要素8の配列($Othello)の要素として8つ入れる。直感的に考えると、8×8の配列を宣言したものと形としては同じと想像できそうだけど、$Othelloの要素に入っている$lineはすべて同じものを参照している。そのため、そのあとの$Othello[3][3]='〇'などで値を変更すると、表示上すべての行が変更される(同じ$lineを参照しているので当然だけど)。要素に入っているのは参照であり、値そのものではないというもの(確かJavaなどでも参照渡しとかの考え方があった)。

要素同士をつなげるには、演算子joinが使えるよう(配列 -join '(つなぐ記号など)')。バッチファイルでもこんな便利なものがあったのかなー。前は、直接つなげるゴリゴリスタイルしかできなかったけど。
オセロの石の表示はできたので、次は再帰処理について考えてみる。