我试图在Powershell中模拟MATLAB的"end
"索引关键字(如A[5:end]
(,但我不想键入数组名称(如$array
(来访问的$array.length
$array[0..($array.length - 2)]
正如在另一个Stackflow问题中所讨论的。我试过$this
(0..7)[4..($this.Length-1)]
给定的($this.Length-1)
似乎被解释为-1,因为输出显示
4
3
2
1
0
7
这让我觉得$This在[]
索引数组时是空的。有没有一种方法可以让数组在不显式重复变量名的情况下引用自己,这样我就可以调用数组的方法来派生索引?这将非常方便地模拟逻辑索引,同时利用方法链接(如a.b.c.d[4..end]
(。
PowerShell没有任何引用";该索引访问运算符所针对的集合";,但是,如果你想跳过集合/枚举的前N个项目,你可以使用Select -Skip
:
0..7 |Select -Skip 4
补充Mathias的有用答案:
-
自动
$this
变量在索引表达式([...]
(中不可用,仅在自定义class
es(指手头的实例(和充当的脚本块中可用。NET事件委托(指事件发送方(。 -
然而,对于您试图实现的目标,您不需要对整个输入数组(集合(的引用:相反,一个抽象表示法用于引用相对于输入数组的端的索引就足够了,理想情况下也适用于";所有剩余的元件";思维方式
您可以使用负索引来引用相对于输入数组末尾的索引,但仅适用于单个索引:
# OK: individual negative indices; get the last and the 3rd last item:
('a', 'b', 'c', 'd')[-3, -1] # -> 'b', 'd'
不幸的是,由于索引表达式中的..
指的是独立的通用范围运算符,因此当负索引用作范围端点时,对基于范围的数组切片无效:
# !! DOES NOT WORK:
# *Flawed* attempt to get all elements up to and including the 2nd last,
# i.e. to get all elements but the last.
# 0..-2 evaluates to array 0, -1, -2, whose elements then serve as the indices.
('a', 'b', 'c', 'd')[0..-2] # -> !! 'a', 'd', 'c'
也就是说,一般范围运算0..-2
对数组0
、-1
、-2
求值,并且所得索引用于提取元素。
正是这种行为当前需要对索引表达式中的数组进行不方便的显式引用,以提取除最后一个元素之外的所有元素,例如问题中的$array[0..($array.length - 2)]
。
GitHub#7940建议引入新语法,通过有效地实现C#风格的范围:来解决这个问题
虽然还没有就语法达成一致,也没有承诺实现这种增强,但直接借用C#的语法是一种选择:
现在 | 未来潜在语法 | 注释
---|---|
$arr[1..($arr.Length-2)] | $arr[1..^1 ] | 从第二个到最后一个
$arr[1..($arr.Length-1)] | $arr[1.. ] | 从第二个el开始的一切
$arr[0..9] | $arr[..9] | 直到第10个el
$arr[-9..-1] | $arr[^9..] | 从第9个到最后一个el的所有内容。[/tr>