$arrays = @();
$array = @();
$string = 'one|two|three';
$array = ($string -split '\|');
$arrays += $array;
$arrays[0][0]
我希望$arrays
是一个二维数组,其第一个元素是对$array
的引用。因此,$arrays[0][0]
将包含字符串' one'。
相反,PoSh似乎将$arrays
展平为一个列表,其中包含“' one'' two'和' three'”等元素。即使我在我的追加操作中将@()
数组构造函数放在$array
周围也是如此。
在我的追加中添加一个额外的元素让我接近,但是我在$arrays
中有空元素:
$arrays = @();
$array = @();
$string = 'one|two|three';
$array = ($string -split '\|');
$arrays += $array, '';
$arrays[0][0]
答案 0 :(得分:3)
将PowerShell的+
运算符与LHS一起视为连接数组 ,即附加的各个元素RHS 到LHS阵列 [1]
:
# 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
即使我将@()数组构造函数放在$ array
周围
,
是数组构造运算符。
@()
是数组子表达式运算符 - 其目的是确保封闭命令的输出变为数组,除非它已经是 。
换句话说:@(1, 2)
之类的内容是 no-op ,因为1, 2
已经 是一个数组。
因此,正如您所发现的,使用,
构建嵌套数组是解决方案:
> (1, 2 + , (3, 4)).Count
3
, (3, 4)
将数组3, 4
包装在单个元素数组中。
+
然后将该数组的每个元素 - 包含3, 4
数组的唯一元素 - 添加到LHS。
[1]我们不要忘记.NET数组是一个不可变的数据结构, 所以真正发生的是,在幕后,PowerShell构建了一个 new 数组。
答案 1 :(得分:2)
经过一些额外的研究后,我发现了this post。显然,这是通过设计完成的。在我的追加操作中在$ array之前添加逗号可以解决问题:
$arrays = @();
$array = @();
$string = 'one|two|three';
$array = ($string -split '\|');
$arrays += ,$array;
$arrays[0][0]