Я хочу сделать sth. например:
foo=(a b c)
foo-=b
echo $foo # should output "a c"
Как удалить запись из массива? foo-=b
не работает.
Удаление должно работать независимо от того, где находится запись.
Я хочу сделать sth. например:
foo=(a b c)
foo-=b
echo $foo # should output "a c"
Как удалить запись из массива? foo-=b
не работает.
Удаление должно работать независимо от того, где находится запись.
Чтобы удалить номер элемента $i
: a=("${(@)a[1,$i-1]}" "${(@)a[$i+1,$#a]}")
(Более простая конструкция a=($a[1,$i-1] $a[$i+1,$#a])
также удаляет пустые элементы.)
ДОБАВЛЕНО:
Чтобы удалить любое событие b
: a=("${(@)a:#b}")
:#
- это иероглиф для удаления соответствующих элементов; ""
и (@)
должны корректно работать на массивах, даже если они содержат пустые элементы.
Второй ответ Gilles правильный, если вы хотите удалить все вхождения, но это полное переназначение массива и не касается ситуации, когда вы хотите удалить только одну запись, независимо от дубликатов. В zsh есть способ удалить элемент из обычного массива без переназначения всего массива:
Учитывая следующий массив:
array=(abc def ghi)
следующее возвращает индекс первого соответствия для def
:
${array[(i)def]}
и следующий формат может быть использован для удаления любого заданного индексированного значения (индекс элемента 2 в этом примере) в массиве без переопределения всего массива:
array[2]=()
таким образом, чтобы удалить значение def
, мы объединяем два:
array[$array[(i)def]]=()
Это очиститель для удаления одного элемента, поскольку нет явного переназначения массива (очистка, при которой любые потенциальные побочные эффекты, такие как случайное удаление пустых элементов, проблемы с цитируемым форматом и т.д., не собираются возникать). Однако решение Gilles в значительной степени эквивалентно и имеет преимущество при удалении нескольких совпадающих элементов, если это то, что вы хотите. С его методом и этим методом у вас есть полный набор инструментов для удаления элемента стандартного массива.
foo = (1 2 3)
shift foo
print $foo
дает: 2 3
Итак, это удаляет первый элемент (это то, что вы хотите?)
[редактировать]
удалите i-й элемент с помощью
foo[$i] =()
вместо.
Чтобы удалить элемент с содержимым "b" из массива:
foo=(a b c)
foo=(${foo#b})