как создать пустой массив - PullRequest
0 голосов
/ 19 октября 2011

UPDATE

Исходное описание ниже содержит много ошибок; gawk lint не жалуется на неинициализированные массивы, используемые в качестве RHS in. Например, следующий пример не дает ошибок или предупреждений. Я не удаляю вопрос, потому что ответ, который я собираюсь принять, дает хорошее предложение использовать split с пустой строкой для создания пустого массива.

BEGIN{
    LINT = "fatal"; 
    // print x; // LINT gives error if this is uncommented 
    thread = 0;
    if (thread in threads_start) { 
        print "if"; 
    } else {  
        print "not if"; 
    }
}

Оригинальный вопрос

Многие из моих скриптов на awk имеют следующую конструкцию:

if (thread in threads_start) {  // LINT warning here
  printf("%s started at %d\n", threads[thread_start]));
} else {
  printf("%s started at unknown\n");
}

С gawk --lint, что приводит к

предупреждение: ссылка на неинициализированную переменную `thread_start '

Итак, я инициализирую в блоке BEGIN следующим образом. Но это выглядит бестолково. Есть ли более элегантный способ создания массива с нулевым элементом?

BEGIN { LINT = 1; thread_start[0] = 0; delete thread_start[0]; }

Ответы [ 2 ]

1 голос
/ 08 ноября 2011

Я думаю, вы могли сделать несколько опечаток в своем коде.

if (thread in threads_start) { // LINT warning here (you think)

Здесь вы ищите индекс thread в массиве threads_start.

  printf("%s started at %d\n", threads[thread_start])); // Actual LINT warning

Но здесь вы печатаете индекс thread_start в массиве threads! Также обратите внимание на различные s '* thread / threads и threads_start / thread_start. Gawk на самом деле правильно предупреждает вас об использовании thread_start (без s) во второй строке.

Также имеется ошибка в вашем формате printf.

При их изменении предупреждение о ворсе исчезает:

if (thread in threads_start) {
  printf("%s started at %d\n", thread, threads_start[thread]));
} else {
  printf("%s started at unknown\n");
}

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

0 голосов
/ 03 апреля 2013

Резюме

Идиоматический метод создания пустого массива в Awk заключается в использовании split().

Подробнее

Чтобы упростить ваш пример выше и сосредоточиться на вашем вопросе, а не на опечатках, фатальная ошибка может быть вызвана с помощью:

BEGIN{
    LINT = "fatal"; 
    if (thread in threads_start) { 
        print "if"; 
    } else {  
        print "not if"; 
    }
}

, которая выдает следующую ошибку:

gawk: cmd. line:3: fatal: reference to uninitialized variable `thread'

Предоставление thread значения перед его использованием для поиска в threads_start проходит linting:

BEGIN{
    LINT = "fatal"; 
    thread = 0;
    if (thread in threads_start) { 
        print "if"; 
    } else {  
        print "not if"; 
    }
}

производит:

not if

Чтобы создать ошибку linting с неинициализированным массивом, нам нужно попытаться получить доступ к несуществующей записи:

BEGIN{
    LINT = "fatal"; 
    thread = 0;
    if (threads_start[thread]) { 
        print "if"; 
    } else {  
        print "not if"; 
    }
}

производит:

gawk: cmd. line:4: fatal: reference to uninitialized element `threads_start["0"]'

Итак, на самом деле не нужно для создания пустого массива в Awk, но если вы хотите сделать это и ответить на свой вопрос, используйте split():

BEGIN{
    LINT = "fatal"; 
    thread = 0;
    split("", threads_start);
    if (thread in threads_start) { 
        print "if"; 
    } else {  
        print "not if"; 
    }
}

производит:

not if

...