Попытка заставить запись в массиве быть массивом - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь создать ассоциативный массив ассоциативных массивов в 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);
            }
        }
    }
}

1 Ответ

2 голосов
/ 28 октября 2019

Извините, готовлю одновременно. Поскольку вы не много публиковали, работать не с чем, но без «инициализации»:

$ awk 'BEGIN {
    options[key] = 0;
    delete options[key];
#    options[key][1]          # cant see me
    split("",options[key]);
}'
awk: cmd. line:5: fatal: split: second argument is not an array

Но с «инициализацией»:

$ awk 'BEGIN {
    options[key] = 0;
    delete options[key];
    options[key][1]          # can see me
    split("",options[key]);
}'
$_ # see this cursor happily blinking without any error
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...