Ассоциативные массивы по умолчанию являются локальными
Ассоциативные массивы кажутся локальными по умолчанию при объявлении внутри тела функции, где они должны быть глобальными. Следующий код
#!/bin/bash
f() {
declare -A map
map[x]=a
map[y]=b
}
f
echo x: ${map[x]} y: ${map[y]}
выводит результат:
x: y:
пока этот
#!/bin/bash
declare -A map
f() {
map[x]=a
map[y]=b
}
f
echo x: ${map[x]} y: ${map[y]}
выводит результат:
x: a y: b
Можно ли объявить глобальный ассоциативный массив внутри функции?
Или что можно использовать?
Ответы
Ответ 1
От: Greg Wooledge
Отправлено: Вт, 23 авг. 2011 06:53:27 -0700
Тема: Re: YAQAGV (еще один вопрос о глобальных переменных)
bash 4.2 добавляет "declare -g" для создания глобальных переменных изнутри функция.
Спасибо, Грег! Однако у Debian Squeeze все еще есть Bash 4.1.5
Ответ 2
Вы уже ответили на свой вопрос с объявлением -g. Обходной путь в версиях bash 4.2 - объявить массив вне функции.
f() {
map[y] = foo
}
declare -A map
foo
echo "${map[y]}"
Ответ 3
Хорошо, 4.2 добавляет "declare -g", но он не работает для ассоциативных массивов, поэтому он (пока) не отвечает на вопрос. Здесь мой отчет об ошибке и Чет подтверждают, что исправление запланировано для следующей версии.
http://lists.gnu.org/archive/html/bug-bash/2013-09/msg00025.html
Но я уверенно нашел обходное решение, вместо того, чтобы объявлять массив и назначать ему начальное значение в одно и то же время, сначала объявить массив, а затем выполнить назначение. То есть, не делайте этого:
declare -gA a=([x]=1 [y]=2)
но вместо этого:
declare -gA a; a=([x]=1 [y]=2)