Аарон Роббинс (Aharon Robbins) сообщил в рассылке о радостном событии — выходе версии 4.0.0 GNU Awk.
При переходе от версии 3.1.8 к 4.0.0 произошел ряд изменений, в том числе и изменения в поведении программы:
- Изменения в поведении gawk
- Для `sub' и `gsub' по умолчанию используется поведение согласно стандарту POSIX 2008
- В соответствии с GNU Coding Standards динамические расширения (плагины) должны теперь определять глобальную переменную plugin_is_GPL_compatible для указания совместимости этих расширений с лицензией GNU GPL
- В режиме POSIX-совместимости для сравнения строк используется strcoll/wcscoll
- Диапазоны вида [d-h] теперь обрабатываются так, как в локали C, независимо от типа используемого регулярного выражения, даже при указании --posix. Последняя версия стандарта POSIX разрешает такое поведение. Это изменение должно пресечь замеченное в старых версиях gawk ветки 3.* поведение, когда в некоторых локалях диапазон [a-z] включал в себя символы в верхнем регистре, подробнее этот вопрос рассмотрен в этой теме рассылки, тем не менее рекомендация использовать [[:lower:]] и [[:upper:]] для таких целей всё ещё актуальна
- Больше не используются специальные файлы /dev/pid, /dev/ppid, /dev/pgrpid, /dev/user. Вместо них рекомендуется пользоваться PROCINFO
- Пробельные (\s) и отличные от пробельных (\S) управляющие последовательности распознаются в регулярных выражениях
- Функция split() принимает четвёртый необязательный аргумент: массив, содержащий значения символов-разделителей
- Новая опция -b / --characters-as-bytes отключает интерпретацию входных данных как многобайтовых символов
- Новая опция --sandbox
- Доступны косвенные вызовы функций
- Количественные модификаторы или квантификаторы (Interval expressions) теперь входят в перечень стандартных регулярных выражений синтаксиса gawk
- Опция --gen-po получила более корректное наименование --gen-pot
- switch / case включены по умолчанию, отпала необходимость включать их на этапе конфигурации
- Добавлена поддержка BEGINFILE и ENDFILE
- Передача в командную строку gawk вместо имени текстового файла имени каталога, теперь генерирует предупреждение, а не фатальную ошибку [1], если не указана --posix или --traditional, с этими опциями генерируется фатальная ошибка
- Новая переменная FPAT позволяет указать регулярное выражение для поля, а не для разделителя полей. Новая функция patsplit() даёт такую же возможность для разделения строк
- Все длинные опции получили короткие аналоги для использования в `#!' скриптах
- Добавлена поддержка IPv6 через специальный файл /inet6/... ; /inet4/... форсирует использование IPv4, а /inet позволяет считать значение по умолчанию в системе (чаще всего IPv4)
- Добавлено предупреждение при использовании /[:space:]/ вместо рекомендуемого /[[:space:]]/
- В основную ветку внесена реализация байт-кодового gawk авторства Джона Хака (John Haque). Добавлен отладчик dgawk, возможно повышение производительности
- `break' и `continue' недействительны вне цикла, даже при указании --traditional
- Классы символов POSIX работают с --traditional (BWK awk также поддерживает их)
- Опции --compat, --copyleft, --usage были удалены по причине их избыточности
- Добавлены массивы массивов (многомерные массивы)
- Удалена опция для raw сокетов, поскольку так и не была реализована
- PROCINFO[«strftime»] теперь содержит формат по умолчанию для strftime()
- При разработке новой версии использованы Autoconf 2.68, Automake 1.11.1, Gettext 0.18.1, Bison 2.5
- Выполнена чистка кода, в том числе удалён код для старых, неподдерживаемых систем (Atari, Amiga, BeOS, Cray, MIPS RiscOS, MS-DOS с Microsoft Compiler, MS-Windows с Microsoft Compiler, NeXT, SunOS 3.x, Sun 386 (Road Runner), Tandem (non-POSIX), Prestandard VAX C compiler for VAX/VMS и др.)
- Если PROCINFO[«sorted_in»] определён, циклы, выполняющие обработку элементов массива по так называемой конструкции «for(iggy in foo)» сортируют индексы прежде чем приступить к проходу по циклу. Значение этого элемента позволяет осуществлять контроль за тем, как индексы будут отсортированы перед началом обхода цикла
- Новая фукнция isarray() проверяющая, является ли элемент массивом, делает возможной обработку многомерных массивов
- Функции asort() и asorti() принимают третий аргумент для указания способа сортировки
>>> Подробности