Есть ли лучший способ получить срез / диапазон массива из какого-либо индекса до конца? - PullRequest
0 голосов
/ 02 января 2019

В рыбных массивах диапазоны основаны на единицах и включают обе крайности, что, неудивительно, что 1002 *, приводит к проблемам, когда требуются диапазоны нулевой длины.

В частности, я нахожусь в ситуации, когда я выделил первые аргументы для своего собственного потребления, и я хочу перевести остальные из них - которых может не быть! - к какой-то команде. Если бы это был Python, я мог бы сделать что-то вроде:

my_arg = sys.argv[1]
other_args = sys.argv[2:]

Однако прямой перевод этого слова на рыбу, к сожалению, не работает в крайних случаях; Рассмотрим

set -l my_arg $argv[1]
set -l other_args $argv[2..-1]

(я сохранил те же индексы, что и при индексировании рыбы на основе 1, $argv не включает то, что будет sys.argv[0])

Это прекрасно работает, пока есть достаточно аргументов; например, если я вызову свою команду с аргументами a b c d e, я получу $my_arg = a и $other_args = b c d e.

Однако, если я вызову его только с a, other_args также будет неожиданно установлен на a. Это связано с тем, что -1 фактически расширяется до чего-то с эффектом (count $argv), поэтому приведенное выше утверждение эквивалентно

set -l other_args $argv[2..1]

, который является инвертированным диапазоном от несуществующего элемента 2 до существующего элемента 1, включительно , который сводится к обычному $argv[1].

Чтобы избежать этой проблемы, в настоящее время я использую этот ужасный обходной путь

set -l other_args $argv[2..(expr (count $argv) + 1)]

, который гарантирует, что последний индекс равен один за последним, что приводит к тому, что диапазон является «прямым», хотя, возможно, и полностью выходит за пределы диапазона (который при необходимости возвращает пустой список).

Однако мне интересно: есть ли лучшее решение, которое я пропускаю?

1 Ответ

0 голосов
/ 02 января 2019

Однако мне интересно: есть ли лучшее решение, которое мне не хватает?

Обновление до 3.0. Это была ошибка в 2.7, которая там исправлена.

Способ, которым это работает сейчас, заключается в том, что если только один из индексов в диапазоне является отрицательным, он всегда будет интерпретироваться как больший из двух, поэтому при отрицательном конце итерация вынуждена идти вперед.

Если индекс на самом деле не больше, это приводит к отсутствию элементов, а это именно то, что вам нужно.

...