質問: @() $ar += "hoge" $ar += ("fu" + "ga") $ar += 1 + 2 $ar += "pi" + "yo" $ar "`n2: ';'で分けるとうまくいく" @( "hoge"; ("fu" + "ga"); 1 + 2; "pi" + "yo" ) "`n3: ','で分けるとうまくいかない" @( "hoge", ("fu" + "ga"), 1 + 2, # 分割されてしまう! "pi" + "yo" # 分割されてしまう! ) "`n4: 1項目なら計算してもうまくいく" @(1 - 2) "`n5: 数字だけでも','だと引き算がエラー" @(1 - 2, 3, 4) "`n6: 上記と同様にエラー" @(1 - 2, 3; 4) "`n7: エラーじゃない!" @(1 - 2; 3, 4) ``` **検証結果** ``` 1: 想定通り hoge fuga 3 piyo 2: ';'で分けるとうまくいく hoge fuga 3 piyo 3: ','で分けるとうまくいかない hoge fuga 1 2 pi yo 4: 1項目なら計算してもうまくいく -1 5: 数字だけでも','だと引き算がエラー [System.Object[]] に 'op_Subtraction' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。 発生場所 C:\Users\payaneco\Scripts\test.ps1:28 文字:1 + @(1 - 2, 3, 4) # エラー + ~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (op_Subtraction:String) []、RuntimeException + FullyQualifiedErrorId : MethodNotFound 6: 上記と同様にエラー [System.Object[]] に 'op_Subtraction' という名前のメソッドが含まれないため、メソッドの呼び出しに失敗しました。 発生場所 C:\Users\payaneco\Scripts\test.ps1:30 文字:3 + @(1 - 2, 3; 4) + ~~~~~~~~ + CategoryInfo : InvalidOperation: (op_Subtraction:String) []、RuntimeException + FullyQualifiedErrorId : MethodNotFound 4 7: エラーじゃない! -1 3 4 ``` なお質問にあたって配列について知りたいことのすべてを参照しましたが、知りたいことを見つけることができませんでした。
回答: そもそも`,`演算子が配列を構築します。`1,2,3`で3項目の配列が作られますし、`,7`で1項目だけの配列です。その上で、この`,`演算子の優先順位がかなり高いです。(正確には演算子ではなさそうです) > > `@("hoge", "fu" + "ga")`と記述すると配列の要素は`["hoge", "fu", "ga"]`に分割されてしまいます。 > > > ``` @("hoge", "fu" + "ga") ↓ @(@("hoge", "fu") + "ga") ↓ @("hoge", "fu") + @("ga") ↓ @("hoge", "fu", "ga") ``` 先に配列が構築され、そこに`+`演算子で配列に項目追加が行われます。 > > `@(1 - 2, 1 + 2)`では各要素がObjectとして扱われ、下記のエラーが発生します。 > > > ``` @(1 - 2, 1 + 2) ↓ @(1 - @(2, 1) + 2) ``` Objectとなるわけではなく `1 - @(2, 1)` つまり `数値 - 配列` が実行できずにエラーです。 なお、`;`はステートメントを終了させるキーワードで優先順位はとても低いです。そのため期待通りの解釈が行われます。 おまけ > > > ``` > @( > "hoge"; > ("fu" + "ga"); > 1 + 2; > "pi" + "yo" > ) > > ``` > > シェルスクリプトらしく**行末**も`;`と同様にステートメントの終了を表すため ``` @( "hoge" "fu" + "ga" 1 + 2 "pi" + "yo" ) ``` でも期待通りの配列になります。