Я пытаюсь создать ассоциативный массив ассоциативных массивов в gawk, и сначала я попытался:
options[key][subkey] = 1
Однако, когда он добрался до этой строки, я бесцеремонно получил ошибку fatal: attempt to use scalar 'option["Declaration"]' as an array
(«Декларация» является одним из основных ключей, которые использует моя программа, хотя я предполагаю, что точное значение не имеет значения. В этот конкретный момент в программе не было назначено ни одной записи «Декларация», хотя были записи с «Декларацией»). в качестве подраздела для других записей, что может иметь смысл).
Поэтому, немного погуглив, я нашел еще один stackoverflow вопрос , который выглядел так, как будто он ответил на мою проблему, поэтому я поставил следующеекод сразу над ним:
if (typeof(options[key])!="array") {
options[key] = 0;
delete options[key];
split("",options[key]);
}
Однако, это тоже не работает, вместо этого теперь выдает ошибку: fatal: split: second argument is not an array
Что я делаю не так?
РЕДАКТИРОВАТЬ: Обратите внимание, что я не могу использовать базовый 2-мерный массив здесь ... для того, что я делаю, важно, чтобы я использовал один ассоциативный массив в другой, потому что я нЧтобы позже можно было идентифицировать подключи, которые использовались для данного ключа.
В соответствии с приведенными ниже запросами я публикую соответствующие функции, которые используют ассоциативный массив, который может помочь прояснить, что происходит.
function add_concrete(key, concrete) {
if (key == concrete) {
return;
}
if (length(options[key])>0) {
for(i in options[key]) {
add_concrete(i, concrete);
}
}
contains[key][concrete] = 1
}
function add_options(name, value) {
subkey = trim(name);
if (subkey == "") {
return;
}
if (match(value, ";") > 0) {
exporting = 0;
}
split(value, args, /[ |;]*/);
for (i in args) {
key = trim(args[i]);
if (key != "") {
print("Adding " name " to " key);
options[key][subkey] = 1
if (concrete[key]) {
add_concrete(subkey, key);
}
}
}
}