5

大量のアイテムがあり、そこからアイテムを抽出したいと考えています。最初からいくつかの項目をスキップし、最後からいくつかの項目をスキップする必要があります。

次の例は単純化されています。

私は最初に境界要素を抽出しようとしました:

> ("a", "b", "c", "d", "e")[1,-2]
b
d  

これは期待どおりに機能します。

ただし、範囲全体を抽出しようとすると、必要なもの以外のものが返されます(['a', 'b', 'c', 'd', 'e'][1:-1]うまく機能するPythonとは対照的です)。

> ("a", "b", "c", "d", "e")[1..-2]
b
a
e
d  

それは逆にループします。ループの方向を変えるには?

取得したい: b c d.

コレクションの実際の長さを使用せずに解決策はありますか?

4

3 に答える 3

5

1..-2 は、最初のアイテムから最後の 2 つのアイテムまでカウントされません。配列を変数に保存し、配列の長さから末尾の項目を引いて上限を指定します。

$a = "a", "b", "c", "d", "e"
$a[1..($a.length-2)]
于 2012-07-11T09:23:37.550 に答える
3

範囲演算子は必要なことを実行しないため、単純なパイプラインで目前のタスクを実行できますが、これは大規模なコレクションのパフォーマンスに影響を与える可能性があります。

コレクションと、上と下からトリミングする要素の数から始めます。

$a = "a", "b", "c", "d", "e"
($fromTop,$fromBottom) = 1, 2

これを使って...

$a | select -skip $fromTop | select -skip $fromBottom -last 1000000

...または、PSCX がインストールされている場合は、次のより簡潔で洗練された手順を実行します。

$a | skip -first $fromTop -last $fromBottom

どちらもb clength プロパティを明示的に使用せずに返されます。2 つのパラメーターを調整して、出力を異なる範囲に調整します。

于 2012-07-11T15:25:54.543 に答える