質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

2回答

10535閲覧

PowerShell の 多次元配列の挙動に納得がいかないのですが、書き方が悪いのでしょうか?

退会済みユーザー

退会済みユーザー

総合スコア0

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

1クリップ

投稿2016/12/28 02:43

下記の画像を見て頂いたほうが早いかと思います。

想定では、左側のソースで、右側の実行結果になる想定をしておりました。
外枠の要素数としては2つの想定です。
多次元配列なので「()」単位で一つの要素想定なのですが、
PowerShell の仕様だと解釈が違うのでしょうか?

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんばんは。
もう解決済みかとは思いますが、PowerShellの配列の仕様についてちょっとだけ説明させてください。

まず、PowerShellで配列を生成するには@を使わないArray Literal(配列リテラル)というものがあります。
これは名前の通りリテラルの配列を記述するための記法です。
この場合、最初の例は以下の様に書くことができ(複数行に分ける場合,は必ず後置しないといけません)、$array.Length=2となります。

ps1

1# Array Literal Expression 2# 複数行にまたがる場合 , は必ず後置 3$array = ( 4 ("[0][0]", "[0][1]"), 5 ("[1][0]", "[1][1]") 6) 7# これはLength=2のジャグ配列を返す 8Write-Output "array length = $($array.Length)"

そして、@を使ったArray subexpression operator(配列部分式演算子)というのもあり、ご質問の例ではこちらを使用しています。
これは@(部分式)の形式で記述し、部分式を評価した結果を配列として返すという動作をします。

このため最初の例は、以下の様に2つの文として評価され、その結果(文1+文2)を配列にして返しているため$array.Length=3となります。

ps1

1# Array SubExpression (Operator) 2# @() 部分式(PowerShellでは部分式に"文"も含まれる)が入り、式("文")を評価した結果を配列にする 3$array = @( 4 ("[0][0]", "[0][1]") # 文1 => Length=2の配列を返す 5 ,("[1][0]", "[1][1]") # 文2 => 先頭の,単項演算子により、Length=1のジャグ配列を返す 6) 7# $arrayは文1+文2の結果を配列にするのでLength=3となる 8Write-Output "array length = $($array.Length)"

そして,については、dupont_kedamaさんもコメントされている通り、これは演算子です。
,は単項演算子および二項演算子として使うことができ、

  • 二項演算子の場合は配列の要素を増やす
  • 単項演算子の場合は要素数1の配列にする

といった動作をします。

投稿2016/12/28 11:45

stknohg

総合スコア796

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

PowerShell

1$array = @(("[0][0]", "[0][1]"), ("[1][0]","[1][1]"))

のように1行で書くと$array.Length=2となるようです。
ちなみに

PowerShell

1$array = @("[0][0]","[0][1]") 2$array = @(("[0][0]","[0][1]")) 3$array = ("[0][0]","[0][1]") 4$array = "[0][0]","[0][1]"

上の4行で生成される配列は全て$array.Length=2, $array[0]="[0][0]", $array[1]="[0][1]"となります。
PowerShellの配列では「()」がなくても配列として許容してしまうので、

PowerShell

11> $array = @( 22> ("[0][0]","[0][1]") 33> , ("[1][0]","[1][1]") 44> )

上のように改行をはさむ場合2行目が$array[0], $array[1]と解釈されてしまうのでしょう。

投稿2016/12/28 04:34

tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/12/28 05:18

ご回答ありがとうございます。 >PowerShellの配列では「()」がなくても配列として許容してしまうので、 やはりそうなのですね。 複数個書きたいけれど1行だと見づらくなってしまう場合、 改行したくなりますが、その場合どうするのがいいのでしょう? 現状、「,」を入れることでうまくいっているようですが、 仕様的に正しいのかどうかわからないです。 1行だと問題ないとのことでしたので、 複数行にまたがるという視点で、バッククォート ( ` ) を追加するとうまくいきました。 ```lang-PowerShell # 多次元配列 $array = @(` ("[0][0]", "[0][1]")` ,("[1][0]", "[1][1]")` ) # 出力 echo $array.Length echo "" foreach($i in $array) { echo $i echo "----------" } ``` ```lang-PowerShell PS C:\WINDOWS\system32> C:\test.ps1 2 [0][0] [0][1] ---------- [1][0] [1][1] ---------- ``` ありがとうございました。
tkturbo

2016/12/28 05:28

http://capm-network.com/?tag=PowerShell%E9%85%8D%E5%88%97 ←こちらによると、要素数1の配列を宣言し、値を設定する場合に $array=@(1) $array=,1 とする方法があるそうです。 仕様としても『「,」を入れることで』対応するのは問題ないと思います。
dupont_kedama

2016/12/28 07:59

「,」は区切り文字ではなく演算子と考えるのがよいです。 ()の外側(同じ行)に演算子を置くことで配列の要素となります。 例では()の前に「,」を置いていますが、後ろでも大丈夫です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問