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 '(つなぐ記号など)')。バッチファイルでもこんな便利なものがあったのかなー。前は、直接つなげるゴリゴリスタイルしかできなかったけど。
オセロの石の表示はできたので、次は再帰処理について考えてみる。