Анимация
JavaScript
|
Главная Библионтека Отладчик в Perl есть чудесный отладчик, работающий на уровне исходного кода. О нем рассказывается на тап-странице perldebug(l). Командная строка При запуске интерпретатора Perl можно указывать множество ключей командной строки. См. man-страницу perlrun(l). Другие операции Помимо упомянутых в книге, используются и другие операции. Например, операция "запятая". Есть также операции манипулирования битами &, I, и ~, трехместная операция ? \:, операции . . и . . . и другие. Имеются также вариации операций, например, допускается использование модификатора g в операции сопоставления. Об этом и многом другом рассказывается на тап-странице perlop(l). Другие функции в Perl очень много функций. Мы не собираемся здесь их все перечислять, потому что самый простой способ узнать о них - это прочитать раздел о функциях в книге Programming Perl и man-страницу perlfunc(l). Вот некоторые из наиболее интересных функций. Функции grep и тар Функция grep выбирает элементы из списка аргументов на основании результата выражения, которое многократно проверяется на истинность, при этом переменная $ последовательно устанавливается равной каждому элементу списка: ebigpowers = grep $ > 6, 1, 2, 4, 8, 16; # получает (8, 16) @b names = grep I, qw(fred barney betty wilma); etextfiles = grep -T, <*>; Функция map похожа на grep, но вместо выбора и отклонения элементов из списка аргументов она просто выдает результаты вычисления выражения (вычисляемого в списочном контексте): emore = map $ + 3, 3, 5, 7; # получает 6, 8, 10 @square s = map $ * $ , 1..10; # квадраты первых 10 чисел @that = map "$ \n", ethis; # как uncliop etriangle = map 1. .$ , 1..5; #1,1,2,1,2,3,1,2,3,4,1,2,3,4,5 %sizes = map ( $ , -s ) <*>; # хеш файлов и размеров Операция eval (и s /e) Да, вы можете создать фрагмент кода во время работы программы и выполнить его при помощи функции eval точно так же, как в shell. Это по-настоящему полезная возможность, благодаря которой можно выполнить оптимизацию периода компиляции (например, получить компилированные регулярные выражения) во время выполнения. С ее помощью можно также вылавливать во фрагменте кода ошибки, которые в противном случае будут фатальными: фатальная ошибка внутри eval просто приводит к выходу из этой функции и выдает пользователю код ошибки. Вот, например, программа, которая читает строку Perl-кода, вводимую пользователем, а затем выполняет ее так, как будто это часть Perl-программы: print "code line: " ; chop{$code = <STDIN>) ; eval $code; die "eval: $@" if $8; Perl-код можно вставить в заменяющую строку при выполнении операции замены с помощью флага е. Это удобно, если вы хотите включить в заменяющую строку нечто сложное, например, вызов подпрограммы, которая возвращала бы результаты поиска в базе данных. Вот цикл, который инкрементирует значение первой колонки для ряда строк: while (О) ( з/{\S+)/$1+1/е; # $1+1 IS Perl code, not a string printf; Функция eval используется также как механизм обработки исключении: eval { some hairy routine that might die(gargs) ; if {$@) ( print "oops some hairy died with $@"; Здесь массив $@ пуст до тех пор, пока блок eval работает нормально, а в противном случае этот блок выдает "сообщение о смерти". Из этих трех конструкций (eval "строка", eval { БЛОК } и s /e) только первая действительно соответствует вашим представлениям об eval из shell. Остальные две компилируются "на ходу", что влечет за собой незначительное снижение производительности. Предопределенные переменные Вы уже знакомы с несколькими предопределенными переменными, например, с переменной $ . Их гораздо больше. В дело их обозначения вовлечены почти все знаки препинания. Здесь вам поможет man-страница perlvar{\), а также модуль English на странице perlmod(l). Обработка таблицы символов с помощью *FRED Вы можете сделать b псевдонимом для а с помощью операции *Ь = *а. Это значит, что $а и $Ь обозначают одну и ту же переменную, равно как @а и @Ь, и даже дескрипторы файлов и форматы а и Ь. Вы можете также объявить *Ь локальной для данного блока с помощью операции local (*Ь), что позволит вам иметь локальные дескрипторы файлов, форматы и другие вещи. Это весьма экстравагантно, но иногда бывает весьма полезно. Дополнительные возможности регулярных выражений Регулярные выражения могут иметь "расширенный" синтаксис (в котором пробельные символы не обязательны, поэтому регулярное выражение может разбиваться на несколько строк и содержать обычные Perl-комментарии), а также иметь положительное и отрицательное "упреждение". Этот синтаксис кажется несколько уродливым, но не пугайтесь и обратитесь к книге Programming Perl или тап-странице perlre(l). Все это и многое другое разъясняется в книге Фридла (Friedl) Mastering Regular Expressions (издательство OReilly & Associates). Пакеты Если над вашим проектом работает много людей или если вы - большой оригинал, вы можете создать пространство имен переменных с помощью пакетов. Пакет - это просто скрытый префикс, который ставится перед именами большинства переменных (кроме тех, которые создаются операцией ту). Изменяя этот префикс, вы получаете разные переменные. Вот небольшой пример: $а = 123; # это на самом деле $main::a $main::a++; # та же переменная, теперь 124 package fred; # теперь префикс - fred $а = 456; # это $fred::a 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 |