了解晦涩的 PowerShell 数组语法:为什么 @(11..20+1) 有效而 @(1+11..20) 无效?我怎样才能实现后者?
Understanding obscure PowerShell array syntax: Why does @(11..20+1) work while @(1+11..20) doesn't? How can I achieve the latter?
考虑以下几点:
(注意:为了便于阅读,我稍微修改了输出)
~> @(11..20)
11, 12, 13, 14, 15, 16, 17, 18, 19, 20
~> @(11..20+1)
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1
~> @(1+11..20)
InvalidOperation: Method invocation failed because [System.Object[]] does not contain a method named 'op_Addition'.
我一直觉得这个数组加法语法很混乱,我更喜欢 @(1,11..20)
.
这样的语法
无论如何,为什么第三个操作与第二个不一样?
是否因为 1
不被视为数组,即使它作为数组定义语法的一部分给出?
~> @(1,2+11..20)
1, 2, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
如果是这样,那么为什么 @(11..20+1)
会按预期工作?
我可以通过几种方式解决这个问题...
~> @(@(1)+11..20)
1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
~> @(,1+11..20)
1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
~> @(11..20+1) | Sort
1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
但这些看起来非常丑陋、不雅,而且后一种解决方法没有考虑到我实际上不想对数组进行排序的情况。
最有意义的是 @(,1+11..20)
,尽管它不是特别令人愉快。有没有更合适的方法以所需的顺序获得所需的结果,而无需额外的语法或管道?
official documentation 中的 None 个示例展示了这种特殊排列。
谢谢。
@(...)
,PowerShell 的 array-subexpression 运算符 - 枚举 ...
输出并将其收集在 [object[]]
数组中 -仅在 ...
评估后应用,因此我们可以在本次讨论中将其搁置。
通常,在 PowerShell 中,操作的 LHS 的类型决定应用何种 type-appropriate 操作重载。
在11..20 + 1
中,LHS是一个数组,由于使用了..
, the range operator,所以+
运算符执行 数组连接 .
在 1 + 11..20
中,LHS 是一个 标量 - 一个 [int]
实例 - 所以 +
运算符尝试执行 数字加法 ,但是,这会失败,因为向数字添加 数组 没有意义,因此不受支持。
如果您想使用 标量 LHS 执行数组连接,请将 LHS 包装在 aux 中。数组使用,
的一元形式,array constructor operator:
, 1 + 11..20
或者,使用以下方法之一:
@(1) + 11..20
[array] 1 + 11..20
如果您事先不知道 LHS 是否实际上 是 已经是一个数组,但您希望它这样对待它,如果不是,则 [array]
cast 是最有效的解决方案:
[array] 1 + 11..20
请注意,转换仅适用于 1
,基于 PowerShell 的 operator precedence rules。
考虑以下几点: (注意:为了便于阅读,我稍微修改了输出)
~> @(11..20)
11, 12, 13, 14, 15, 16, 17, 18, 19, 20
~> @(11..20+1)
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1
~> @(1+11..20)
InvalidOperation: Method invocation failed because [System.Object[]] does not contain a method named 'op_Addition'.
我一直觉得这个数组加法语法很混乱,我更喜欢 @(1,11..20)
.
无论如何,为什么第三个操作与第二个不一样?
是否因为 1
不被视为数组,即使它作为数组定义语法的一部分给出?
~> @(1,2+11..20)
1, 2, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
如果是这样,那么为什么 @(11..20+1)
会按预期工作?
我可以通过几种方式解决这个问题...
~> @(@(1)+11..20)
1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
~> @(,1+11..20)
1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
~> @(11..20+1) | Sort
1, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20
但这些看起来非常丑陋、不雅,而且后一种解决方法没有考虑到我实际上不想对数组进行排序的情况。
最有意义的是 @(,1+11..20)
,尽管它不是特别令人愉快。有没有更合适的方法以所需的顺序获得所需的结果,而无需额外的语法或管道?
None 个示例展示了这种特殊排列。
谢谢。
@(...)
,PowerShell 的 array-subexpression 运算符 - 枚举 ...
输出并将其收集在 [object[]]
数组中 -仅在 ...
评估后应用,因此我们可以在本次讨论中将其搁置。
通常,在 PowerShell 中,操作的 LHS 的类型决定应用何种 type-appropriate 操作重载。
在
11..20 + 1
中,LHS是一个数组,由于使用了..
, the range operator,所以+
运算符执行 数组连接 .在
1 + 11..20
中,LHS 是一个 标量 - 一个[int]
实例 - 所以+
运算符尝试执行 数字加法 ,但是,这会失败,因为向数字添加 数组 没有意义,因此不受支持。
如果您想使用 标量 LHS 执行数组连接,请将 LHS 包装在 aux 中。数组使用,
的一元形式,array constructor operator:
, 1 + 11..20
或者,使用以下方法之一:
@(1) + 11..20
[array] 1 + 11..20
如果您事先不知道 LHS 是否实际上 是 已经是一个数组,但您希望它这样对待它,如果不是,则 [array]
cast 是最有效的解决方案:
[array] 1 + 11..20
请注意,转换仅适用于 1
,基于 PowerShell 的 operator precedence rules。