как создать пустой массив

#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. Спасибо, что вернули меня к этому глупому вопросу. Спасибо, что игнорируете ошибки и по-прежнему предоставляете полезный ответ.