The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги ]

Интерактивная система просмотра системных руководств (man-ов)

 ТемаНаборКатегория 
 
 [Cписок руководств | Печать]

a2p (1)
  • a2p (1) ( Solaris man: Команды и прикладные программы пользовательского уровня )
  • >> a2p (1) ( Русские man: Команды и прикладные программы пользовательского уровня )
  • a2p (1) ( Linux man: Команды и прикладные программы пользовательского уровня )
  •  

    НАЗВАНИЕ

    a2p - Транслятор Awk в Perl

     

    СИНТАКСИС

    a2p [options] имя_файла

     

    ОПИСАНИЕ

    A2p принимает на входе awk-скрипт, указанный в командной строке (или со стандартного ввода), и выводит на стандартный вывод соответствующий ему perl скрипт.

     

    ОПЦИИ

    Имеются следующие опции:

    -D<число>

    установить уровень отладки.

    -F<символ>

    указать a2p, что входной awk-скрипт всегда вызывается с опцией -F с указанным символом.

    -n<список_полей>

    указывает имена входных полей, если awk-скрипт должен разбивать строки на поля, а не на элементы массива. Например, при переводе awk-скрипта, обрабатывающего файл паролей, Вы можете задать следующую командную строку:

    
    a2p -7 -nlogin.password.uid.gid.gcos.shell.home
    
    
    Для разделения имен полей может использоваться любой разделитель.

    -<число>

    a2p должен предполагать, что входной поток всегда будет иметь указанной число полей.

    -o

    указывает a2p, что awk-скрипт имеет `устаревшее' поведение. В настоящее время единственным отличием между старой и новой версиями awk является то, что старый awk всегда организует цикл по строке, даже если не указано никаких действий на эту строку, в то время как новый awk этого не делает.

     

    Комментарии

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

    Как правило, awk представляет строку как параметр int() для перевода ее в числовой вид, даже если эта строка уже является числом. Обычно в perl-скриптах в этом нет необходимости, но a2p не может знать заранее, будет ли аргумент всегда числовым, поэтому он оставляет вызов int() в выходном скрипте. Можете убрать его.

    Perl различает операции числового и строкового сравнения. В awk есть только один оператор, определяющий во время выполнения, какой именно тип сравнения производить. В этом случае a2p не эмулирует полностью поведение awk, а просто пытается догадаться, какая операция имелась в виду. Почти всегда ему это удается, однако полностью доверять этому нельзя. Все подобные догадки помечены комментариями "#???". Вы должны сами проверить их. По крайней мере, Вы можете запустить perl с опцией -w, которая предупредит Вас об использовании оператора `==' в том месте, где нужно использовать `eq'.

    Perl не пытается эмулировать поведение awk в тех случаях, когда для появления несуществующих элементов массива необходимо простое обращение к ним. Если Вы каким-то образом опираетесь на этот механизм для создания пустых элементов в циклах for...in, то помните, что в perl это не сработает.

    Если a2p произодит скрипт, разбивающий строку на список переменных вроде (Fld1, Fld2, Fld3...), то Вы можете заново запустить a2p с описанной выше опцией -n. Это позволит задать Вам имена полей во всем выходном скрипте. Если после этого a2p генерирует разбиение по элементам массива, то, вероятно, в скрипте есть ссылка на количество полей.

    Оператор exit не обязательно завершает awk-скрипт; он осуществляет переход к блоку END (если он есть). Awk-скрипты, производящие выход в блок END для обхода другого блока, в данном случае могут быть упрощены удалением условий в блоке END и простым выходом прямо из perl-скрипта.

    В языке Perl определяются два типа массивов - с числовым индексом и ассоциативные. Последние называются "hashes" (хэш). Массивы Awk всегда транслируются в хэши, но если Вы знаете, что индекс этого хэша всегда будет числовым, то можете поменять индексирование {...} на [...]. Построение циклов по хэшам производится с помощью функции keys(), которая НЕ работает для массивов с числовыми индексами. Вам придется переписать каждый цикл, работающий с такими массивами.

    При запуске awk предполагает, что переменная OFMT имеет значение %.6g. Perl при запуске полагает, что ее эквивалент $# имеет значение %.20g. Если Вы используете значение OFMT по умолчанию, то Вам придется установить $# в соответствующее значение явно.

    Рядом с началом циклов по строкам генерируется операция разбиения (split), неявно подразумеваемая в awk-скрипте. Иногда Вы можете переместить ее в конец цикла и, возможно пропустив при этом несколько проверок условий по всей записи, добиться таким образом повышения эффективности, поскольку операция разбиения будет вызываться не так часто.

    По эстетическим соображениям Вы можете изменить базу индексации массивов $[ с 1 на 0, используемый в perl по умолчанию. Не забудьте только после этого соответственно поменять ВСЕ индексы массивов и поправить операции substr() и index().

    Хитроумные комментарии вроде ``# Это хитрый обходной путь мимо тупости awk'' остаются без изменений.

    Awk-скрипты часто вставляются внутрь обычных шелл-скриптов, при этом они, как правило, являются членами различных конвейеров. И достаточно часто команды шелла, организующие конвейеры, могут быть переписаны непосредственно на perl, поскольку perl может запускать односторонние и двусторонние конвейеры прямо из себя, а также делать многие другие вещи, которые не умеет делать awk.

    Скрипты, использующие специальные переменные RSTART и RLENGTH, часто могут быть упрощены заменой последних на переменные $`, $& и $', если только они находятся в диапазоне видимости операций сравнения с шаблоном, в которых они устанавливаются.

    Сгенерированные perl-скрипты могут иметь подпрограммы, предназначенные для обработки семантики awk-функций getline и print. Поскольку a2p часто приносит производительность в жертву лингвистической корректности, то Вы почти всегда можете произвести обратную операцию - улучшить эффективность perl-кода, избавившись от семантических изюминок.

    Опять же в целях повышения эффективности, вы можете удалить ключевое слово return изо всех операторов, которые выполняются последними в подпрограммах. A2p отлавливает наиболее общий случай, но не анализирует вложенные блоки.

    ARGV[0] переводится как $ARGV0, но ARGV[n] переводится как $ARGV[$n]. Код, пытающийся в цикле пройти ARGV[0], не найдет эту переменную.

     

    ОКРУЖЕНИЕ

    A2p не использует никаких переменных среды.

     

    АВТОР(Ы)

    Larry Wall <larry@wall.org>

     

    ФАЙЛЫ

     

    СМ. ТАКЖЕ

    perl

    Компилятор/интерпретатор perl

    s2p

    Транслятор sed в perl

     

    СООБЩЕНИЯ ОБ ОШИБКАХ

     

    ОШИБКИ

    Возможна эмуляция поведения awk в выборе между строковым и числовым типами сравнения во время выполнения, однако она будет громоздкой и неэффективной. Кроме того, a2p почти всегда определяет тип сравнения правильно.

    В настоящее время память под синтаксическое дерево awk отводится статически, и может поэтому быстро закончиться.


     

    Index

    НАЗВАНИЕ
    СИНТАКСИС
    ОПИСАНИЕ
    ОПЦИИ
    Комментарии
    ОКРУЖЕНИЕ
    АВТОР(Ы)
    ФАЙЛЫ
    СМ. ТАКЖЕ
    СООБЩЕНИЯ ОБ ОШИБКАХ
    ОШИБКИ


    Поиск по тексту MAN-ов: 




      Закладки на сайте
      Проследить за страницей
    Created 1996-2017 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    Hosting by Ihor