Анимация
JavaScript
|
Главная Библионтека в этой главе: • Прсобраяовтше ток-програмл1 в Perl-программы • Преобрааованис sed-программ в Perl-программы • Преобразование shett-сценариев в РеН-программы • Упражнение Преобразование других программ в РеН-программы Преобразование awk-программ в РеН-программы Одна из самых замечательных особенностей Perl состоит в том, что он представляет собой семантическое надмножество (как минимум) языка awk. С практической точки зрения это значит, что если вы можете сделать что-либо в awk, вы сможете сделать это и в Perl. При этом, однако, Perl не обладает синтаксической совместимостью с awk. Например, переменная NR (номер входной записи) awk представляется в Perl как $. Если у вас есть а-программа и вы хотите выполнить ее Perl-вариант, можно осуществить механическое преобразование этой программы с помощью утилиты а2р, которая есть в дистрибутиве Perl. Эта утилита конвертирует синтаксис awk в синтаксис Perl и может создать непосредственно выполняемый Perl-сценарий для подавляющего больщинства flw-программ. Чтобы воспользоваться утилитой а2р, поместите свою awk-nporpaMuy в отдельный файл и вызовите а2р с именем этого файла в качестве аргумента или переадресуйте стандартный ввод а2р на ввод из этого файла. В результате на стандартном выводе а2р вы получите нормальную Perl-программу. Например; $ cat rayawkprog BEGIN { sura = О } /llama/ ( sura += $2 ) END ( print "The llaraa count is " sura ) 18. Преобразование других программ в РеН-программы $ а2р <rayawkprog >myperlprog $ perl rayperlprog somefile The llama count is 15 $ Можно также направить стандартный вывод а2р прямо в Perl, потому что интерпретатор Perl принимает программу со стандартного ввода, если получает такое указание: $ а2р <myawkprog perl - somefile The llama count is 15 Преобразованный для использования в Perl ан-сценарий, как правило, выполняет идентичную функцию, часто с большей скоростью и, конечно, без каких-либо присуших awk ограничений на длину строки, количество параметров и т.д. Некоторые преобразованные Perl-профаммы могут выполняться медленнее; Perl-действие, эквивалентное данной анА:-операции, не обязательно будет самым эффективным Perl-кодом, по сравнению с написанным врушую. Вы, возможно, захотите оптимизировать преобразованный Perl-код или добавить в Perl-версию программы новые функциональные возможности. Это сделать довольно просто, поскольку полученный Perl-код читается достаточно легко (уштывая, что перевод выполняется автоматически, следует отметить это как большое достижение). В некоторых случаях перевод не выполняется механически. Например, сравнение "меньше чем" и для чисел, и для строк в awk выражается операцией <. В Perl для строк используется it, а для чисел - операция <. В большинстве случаев awk, как и утилита а2р, делает разумное предположение относительно числового или строкового характера двух сравниваемых значений. Однако вполне возможно, что о каких-нибудь двух значениях будет известно недостаточно много для того, чтобы определить, какое должно выполняться сравнение - числовое или строковое, поэтому а2р использует наиболее вероятную операцию и помечает возможно ошибочную строку знаками #?? (Perl-комментарием) и пояснением. После преобразования обязательно просмотрите результат на предмет наличия таких комментариев и проверьте сделанные предположения. Более подробно о работе утилиты а2р рассказывается на ее тап-странице. Если этой утилиты в том каталоге, откуда вы вызываете Perl, нет, громко пожалуйтесь тому, кто инсталлировал вам Perl. Преобразование sed-программ в Perl-программы Может быть, вам покажется, что мы повторяемся, но угадайте, что мы сейчас скажем? А вот что: Perl - семантическое надмножество не только awk, но и sed. С дистрибутивом поставляется конвертор sed-Verl, который называется s2p. Как и а2р, s2p получает со стандартного ввода 5е<-сценарий и направляет на стандартный вывод Perl-программу. В отличие от результата работы а2р, преобразованная прОфамма редко ведет себя не так, как нужно, поэтому вы вполне можете рассчитывать на ее нормальную работу (при отсутствии дефектов в самой s2p или Perl). Конвертированные 5е<-программы могут работать быстрее или медленнее оригинала. Как правило, они работают значительно быстрее (благодаря хорошо оптимизированным Perl-программам обработки регулярных выражений). Конвертированный 5е<-сценарий может работать с опцией -п или без нее. Опция -п имеет тот же смысл, что и соответствующий ключ для sed. Чтобы воспользоваться этой опцией, конвертированный сценарий должен направить сам себя в препроцессор С, а это несколько замедляет запуск. Если вы знаете, что всегда будете вызывать конвертированный ей-сценарий с опцией -п или без нее (например, при преобразовании ел-сценария, используемого в больших shell-программах с известными аргументами), вы можете информировать утилиту s2p об этом (посредством ключей -п и -р), и она оптимизирует сценарий под выбранный вами ключ. В качестве примера, демонстрирующего высокую универсальность и мощь языка Perl, отметим тот факт, что транслятор s2p написан на Perl. Если вы хотите увидеть, как Ларри программирует на Perl, взгляните на этот транслятор - только сначала сядьте, чтобы не упасть (даже с уютом того, что это очень древний код, относительно не изменившийся с версии 2). Преобразование shell-сценариев в Perl-программы Вы, наверное, подумали, что речь пойдет о конверторе, осуществляющем преобразование shell-сценариев в Perl-программы? А вот и нет. Многие спрашивают о такой программе, но проблема в том, что большинство из того, что делает сценарий, делается отнюдь не им самим. Большинство сценариев shell тратят практически все свое время на вызовы отдельных программ для извлечения фрагментов строк, сравнения чисел, конкатенации файлов, удаления каталогов и т.д. Преобразование такого сценария в Perl требовало бы понимания принципа работы каждой из 18. Преобразование другим програлим в РеН-ирограммы 227 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 [ 71 ] 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |