Powershell数组和括号

时间:2014-04-24 21:40:32

标签: powershell syntax

来自其他编程语言,我希望以下语句都能产生相同的结果。有人可以解释为什么括号在这里有所作为吗?

PS D:\>   "ab",      "cd"
ab
cd
PS D:\>  "a"+"b" ,  "c"+"d"
ab cd
PS D:\>  "a"+"b" , ("c"+"d")
ab cd
PS D:\> ("a"+"b"),  "c"+"d"
ab
c
d
PS D:\> ("a"+"b"), ("c"+"d")
ab
cd
PS D:\>

1 个答案:

答案 0 :(得分:11)

适用的规则如下:

  • ,是一个一元或二元运算符,它创建一个操作数数组,它的优先级高于+运算符。
  • +运算符可用于数字加法,字符串连接和数组连接。 left 操作数的数据类型决定了执行的操作类型。如果可能,将右操作数强制转换为左操作数的数据类型;如果不可能,则抛出错误。 *
  • 如果优先权相同,则从左到右进行评估。
  • 通过列出以空格分隔的元素,将数组转换为字符串。
  • 如您所料,括号的优先级高于任何运算符,并使括号表达式在括号外的任何内容之前进行求值。
  • 数组对象的默认输出是元素列表,每行一个。

*这解释了看似不一致的结果,例如"foo" + 1评估为foo1,但1 + "foo"会给您一个错误。

因此,让我们看一下您的测试用例,并分析上述逻辑后发生的情况。


案例I:

"ab", "cd"

这个非常简单:,运算符创建了一个包含两个字符串abbc的数组。


案例II:

"a" + "b", "c" + "d"

乍一看这个似乎是违反直觉的;关键是要意识到在,之前评估+。以下是逐步获得结果的方法:

    首先评估
  1. "b", "c"(由于,优先于+),创建元素bc的数组。
  2. 接下来,+运算符应用于"a"和步骤1中创建的数组。由于左操作数"a"是字符串,因此执行字符串连接。
  3. 要将字符串与数组连接,该数组将转换为字符串。 bc数组成为字符串b c
  4. ab c联系起来ab c
  5. 最后,ab cd连接以生成最终结果ab cd

  6. 案例III:

    "a"+"b" , ("c"+"d")
    

    这巧合得出相同的结果;评估的方式不同:

      由于括号,首先评估
    1. ("c"+"d")。这是一个普通的字母串连接,产生字符串cd
    2. 接下来,,运算符应用于"b"和步骤1中的字符串,创建元素bcd的数组。 (这是在"a" + "b"之前评估的,因为,的优先级高于+。)
    3. 然后,+运算符应用于"a"和在步骤2中创建的数组。由于左操作数是字符串,因此执行字符串连接。
    4. bcd数组被投射为字符串b cd
    5. 字符串ab cd会连接在一起,从而产生最终输出ab cd

    6. 案例IV:

      ("a" + "b"),  "c" + "d"
      

      这是最有趣的测试用例,可能是最直观的,因为它会产生可能看起来不一致的结果。以下是它的评估方式:

      1. 与案例III第1步类似,首先评估("a" + "b"),生成字符串ab
      2. ,已应用于步骤1和"c"中的字符串,从而创建了元素abc的数组。
      3. +运算符应用于步骤2中的数组和下一个标记"d"。这次,左操作数是一个数组,因此执行数组连接。
      4. 字符串操作数"d"被强制转换为一个元素的数组。
      5. 这两个数组连接成元素abcd的数组。

      6. 案例五:

        ("a" + "b"), ("c" + "d")
        

        到目前为止,应该很容易看到这里发生了什么:

        1. ("a" + "b")被评估为字符串ab
        2. ("c" + "d")被评估为字符串cd
        3. ,已应用于步骤1和2中的字符串,创建了abcd的数组。

        4. 您可以使用命令

          查看precedence table
          Get-Help about_Operator_Precedence
          

          (帮助文档名称可以制表,所以为了保存输入,help about_op TAB TAB