Видалити масив in awk


18

У дивовизі я можу очистити масив із циклом, зробивши його порожнім масивом, що еквівалентно видаленню.

for (key in array) delete array[key];

Чи є простіший спосіб? Чи можу я повністю видалити масив, щоб ім'я змінної можна було повторно використовувати для скаляра?

Відповіді:


29

Синтаксис

delete array

не існує в поточних версіях POSIX, але він підтримується практично всіма існуючими реалізаціями (включаючи оригінальний awk, GNU, mawk та BusyBox). Він буде доданий у майбутній версії POSIX (див. Дефект 0000544 ).

Альтернативний спосіб очищення всіх елементів масиву, який є і портативним, і сумісним зі стандартами, і який є виразом, а не твердженням, - покладатися на splitвидалення всіх існуючих елементів:

split("", array, ":")

Усі вони, в тому числі delete array, залишають змінну позначеною як змінну масиву в початковому awk, в GNU awk та в mawk (але не в BusyBox awk). Наскільки мені відомо, як тільки змінна використовується як масив, немає ніякого способу використовувати її як скалярну змінну.


Альтернативне рішення про розкол було корисним. Несподіванкою було виявити, що SCO Openserver 5.0.7 awk викликає delete arrayсинтаксичну помилку, хоча на сторінці man говориться, що підпис не є обов'язковим. $ awk 'BEGIN { A[1] = 0; delete A; }' awk: Syntax error at line 1 of program << BEGIN { A[1] = 0; de ... >> context is BEGIN { A[1] = 0; delete >>> A; <<< awk: illegal statement at line 1 of program << BEGIN { A[1] = 0; de ... >>Більш дивно було виявити, що delete array[subscript], хоча і не було показано як помилка, також не працювало, і багато варіантів на них array[subscript] = ""були однаково неефективними.
kbulgrien

1
Або простоsplit("", array)
ryenus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.