#lint #gawk
#lint #gawk
Вопрос:
Обновить
В исходном описании ниже много ошибок; gawk lint не жалуется на неинициализированные массивы, используемые в качестве RHS of 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 %dn", threads[thread_start]));
} else {
printf("%s started at unknownn");
}
В gawk --lint
результате чего
предупреждение: ссылка на неинициализированную переменную `thread_start’
Итак, я инициализирую в начальном блоке следующим образом. Но это выглядит бестолково. Есть ли более элегантный способ создания массива с нулевым элементом?
BEGIN { LINT = 1; thread_start[0] = 0; delete thread_start[0]; }
Ответ №1:
Я думаю, вы, возможно, допустили несколько опечаток в своем коде.
if (thread in threads_start) { // LINT warning here (you think)
Здесь вы ищете индекс thread
в массиве threads_start
.
printf("%s started at %dn", threads[thread_start])); // Actual LINT warning
Но здесь вы печатаете индекс thread_start
в массиве threads
! Также обратите внимание на разные s thread
/ threads
и threads_start
/ thread_start
. Gawk на самом деле правильно предупреждает вас об использовании thread_start
(без s) во второй строке.
В вашем формате также есть ошибка printf
.
При изменении этих параметров предупреждение о lint исчезает:
if (thread in threads_start) {
printf("%s started at %dn", thread, threads_start[thread]));
} else {
printf("%s started at unknownn");
}
Но, возможно, я неправильно понял, что должен делать ваш код. В таком случае, не могли бы вы опубликовать минимальный автономный пример кода, который выдает ложное предупреждение о ворсе?
Ответ №2:
Краткие сведения
Идиоматический метод создания пустого массива в 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
Чтобы создать ошибку компоновки с неинициализированным массивом, нам нужно попытаться получить доступ к несуществующей записи:
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
Комментарии:
1. Спасибо, что вернули меня к этому глупому вопросу. Спасибо, что игнорируете ошибки и по-прежнему предоставляете полезный ответ.