Powershell为什么要展平我的阵列?

Powershell为什么要展平我的阵列?,powershell,Powershell,我希望$array是一个二维数组,其中的第一个元素是对$array的引用。因此,$arrays[0][0]将包含字符串“one” 相反,PoSh似乎将$array扁平化为一个包含元素“一”、“二”和“三”的列表。即使我在append操作中将@()数组构造函数放置在$array周围,这也是正确的 在append中添加一个额外的元素可以让我接近,但是在$arrays中会有空元素: $arrays = @(); $array = @(); $string = 'one|two|three'; $ar

我希望
$array
是一个二维数组,其中的第一个元素是对
$array
的引用。因此,
$arrays[0][0]
将包含字符串“one”

相反,PoSh似乎将
$array
扁平化为一个包含元素“一”、“二”和“三”的列表。即使我在append操作中将
@()
数组构造函数放置在
$array
周围,这也是正确的

在append中添加一个额外的元素可以让我接近,但是在
$arrays
中会有空元素:

$arrays = @();
$array  = @();
$string = 'one|two|three';
$array  = ($string -split '\|');
$arrays += $array;
$arrays[0][0]

经过一些额外的研究,我发现。显然,这是有意为之。在我的追加操作中,在$array之前添加逗号可以修复此问题:

$arrays = @();
$array  = @();
$string = 'one|two|three';
$array  = ($string -split '\|');
$arrays += $array, '';
$arrays[0][0]

将PowerShell的
+
运算符与作为LHS的数组看作是串联数组
,即将RHS的各个元素附加到LHS数组[1] :

即使我将@()数组构造函数放在$array周围

数组构造操作符是

@()
是数组子表达式运算符-其目的是确保封闭命令的输出成为数组,除非它已经是数组。
换句话说:
@(1,2)
之类的东西是不可操作的,因为
1,2
已经是一个数组了

因此,正如您所发现的,使用
构造嵌套数组是解决方案:

# Note: , has higher precedence than +, so this is the same as: ((1, 2) + (3, 4)).Count
> (1, 2 + 3, 4).Count # Same as: (1, 2, 3, 4).Count
4
  • ,(3,4)
    将数组
    3,4
    包装在单个元素数组中

  • +
    然后将该数组的每个元素(即被包装的
    3,4
    数组的唯一元素)添加到LHS


[1] 我们不要忘记.NET数组是一种不可变的数据结构,
因此,真正发生的是,PowerShell在幕后构建了一个新的阵列。

这些都是非常有用的细节。非常感谢您的解释。理解到
实际上是数组构造操作符,这看起来不像PoSh在幕后做一些不规则的事情。
# Note: , has higher precedence than +, so this is the same as: ((1, 2) + (3, 4)).Count
> (1, 2 + 3, 4).Count # Same as: (1, 2, 3, 4).Count
4
> (1, 2 + , (3, 4)).Count
3