What is the idiomatic way to slice an array relative to both of its ends? What is the idiomatic way to slice an array relative to both of its ends? arrays arrays

What is the idiomatic way to slice an array relative to both of its ends?


If you want to get n elements from the end of an array simply fetch the elements from -n to -1:

PS C:\> $a = 0,1,2,3PS C:\> $n = 2PS C:\> $a[-$n..-1]23

Edit: PowerShell doesn't support indexing relative to both beginning and end of the array, because of the way $a[$i..$j] works. In a Python expression a[i:j] you specify i and j as the first and last index respectively. However, in a PowerShell .. is the range operator, which generates a sequence of numbers. In an expression $a[$i..$j] the interpreter first evaluates $i..$j to a list of integers, and then the list is used to retrieve the array elements on these indexes:

PS C:\> $a = 0,1,2,3PS C:\> $i = 1; $j = -1PS C:\> $index = $i..$jPS C:\> $index10-1PS C:\> $a[$index]103

If you need to emulate Python's behavior, you must use a subexpression:

PS C:\> $a = 0,1,2,3PS C:\> $i = 1; $j = -1PS C:\> $a[$i..($a.Length+$j-1)]12


Although not as neat as you might want but is cleaner in the way PowerShell works ...

(@(1,2,3,4)) | Select-Object -Skip 1

returns ...

234


Combine Select-Object -Skip and Select-Object -SkipLast like:

$a = 0,1,2,3$a | Select-Object -Skip 1 | Select-Object -SkipLast 1

Returns:

12

Not as elegant as Python, but at least you don't have to use Count or Length, meaning this also works if the array isn't stored in a variable.