Статьи

Учебник по Perl: что такое Perl?

Perl — сокращение от « Практическое извлечение» и «Язык отчетов» . Этот язык доступен бесплатно через Интернет и используется для самых разных целей, от написания сценариев CGI до помощи администраторам в обслуживании их систем. Perl был создан и до сих пор поддерживается Ларри Уоллом. Это медленнее, чем C, но быстрее, чем обычный интерпретируемый язык. Вместо этого он компилируется, когда выполняется, а затем интерпретируется. Компилятор Perl существует, но он все еще находится в стадии разработки. Для получения дополнительной информации о скомпилированном Perl перейдите на домашнюю страницу Perl .

Как я упоминал ранее, одна из приятных сторон Perl — это то, что он бесплатный. Он распространяется под лицензией GNU, а источник доступен на домашней странице Perl. Это, наряду с тем, что он гибкий и имеет очень мало ограничений, помогает сделать Perl популярным языком. Он также очень независим от платформы и был портирован на множество различных платформ, включая Unix, Windows и даже DOS. Модификации кода могут быть незначительными или значительными в зависимости от используемых системных функций.

Популярность Perl также была поддержана тем фактом, что вы можете найти поддержку в самых разных местах. В верхней части списка находится группа новостей comp.lang.perl / # nlt # / Perl , которую модерирует ряд экспертов по Perl.

Perl и CGI

Это краткое объяснение Perl и CGI. Если вы хотите или хотите создать свой собственный веб-сайт, вы услышали о HTML, Javascript, Java и CGI. CGI расшифровывается как Common Gateway Interface . CGI отличается от Javascript, HTML и клиентской Java. CGI предоставляет стандартный метод для программ, написанных на любом языке, для запуска на стороне сервера и для связи с программным обеспечением веб-сервера в ответ на запросы о веб-страницах. Другими словами, CGI — это часть вашего веб-сайта, которая взаимодействует с другими программами, запущенными на вашем сервере.

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

Именно здесь и вступает CGI. Для реализации этих типов интерактивности на сервере должно быть запущено приложение, которое, например, знает, как обрабатывать определенные типы пользовательского ввода. Как я уже упоминал, CGI-скрипты могут быть написаны на любом языке, но наиболее распространенными являются Perl и C. Perl является предпочтительным языком для написания CGI-скриптов из-за его силы в манипулировании строками. И теперь другие языки программирования, такие как Java и PHP, также набирают популярность, поскольку они обеспечивают интерактивность без использования CGI.

Программирование на CGI — это не что иное, как программирование с некоторыми специальными типами ввода и несколькими очень строгими правилами для вывода программы. Когда пользователь заполняет ФОРМУ (набор HTML-тегов, которые позволяют ему отправлять ввод), сервер отправляет ввод формы в указанную программу CGI, которая, в свою очередь, анализирует введенные данные и использует их заданным образом и возвращает HTML. с ответом на запрос пользователя.

Когда вы выбираете язык для написания CGI-скриптов, убедитесь, что выбранный вами язык:

  • Облегчает манипулирование текстом
  • Умеет взаимодействовать с другими программными утилитами и библиотеками
  • Может получить доступ к переменным окружения вашей операционной системы

Perl удовлетворяет всем вышеперечисленным требованиям, что делает его очень хорошим языком для программирования CGI. Если вы хотите написать свои собственные CGI-скрипты, я бы посоветовал вам использовать Perl — вы обнаружите, что это сделает вашу жизнь намного проще. Если вы хотите узнать больше о CGI и о том, как он работает, попробуйте спецификацию CGI на сайте NCSA (имейте в виду, это довольно техническое описание, предназначенное для опытных программистов).

Запуск Perl-программы

Примечание: это не научит вас всему о Perl, но должно дать вам хорошее представление о том, как работает язык и как программировать на Perl.

Запуск Perl-программы относительно прост. После того, как вы написали программу, все, что вам нужно сделать, это вызвать интерпретатор Perl вместе с именем файла.

perl filename.pl 

Если вы работаете в системе Unix, вы можете сделать файл исполняемым с помощью вызова функции chmod + rx. Чтобы сделать это, вы должны иметь следующую строку в качестве первой строки в вашей Perl-программе.

 #! /usr/local/bin/perl 

Где » / usr / local / bin / perl » — это путь вашего интерпретатора Perl. Чтобы найти этот путь в UNIX, просто наберите:

 which perl 

в командной строке.

Попробуем написать небольшую программу на нашей консоли. Используя любой редактор, введите следующий код:

  #! /usr/local/bin/perl 

print "Hello World! \ n";

Теперь сохраните вашу программу с расширением .pl. Давайте назовем это hello.pl. Из командной строки введите:

 perl hello.pl 

Затем вы должны увидеть следующий вывод:

 Hello World! 

Вы только что написали свою первую программу на Perl. Поздравляем!

литералы

Литералы Perl — это значения, которые представлены как есть. Значение считается жестко запрограммированным в программе. Perl поддерживает литералы следующих двух типов:

  • чисел
  • Струны

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

Perl также поддерживает комментарии в вашем коде. Perl-комментарий обозначается знаком #. Когда вы видите знак #, это означает, что все после этого является комментарием до конца строки.

переменные

Все языки программирования поддерживают переменные. Переменные похожи на строковые литералы, за исключением того, что они содержат определенное значение или значения. Perl поддерживает три набора переменных:

  • Скаляры Скалярные переменные содержат только одно значение, которое может быть числовым или строковым литералом. Имена скалярных переменных всегда начинаются со знака $.
  • Массивы Переменная массива может содержать список или массив значений. Значения могут быть числами или строками. Значение ключа или индекса присваивается автоматически, а значения сохраняются в указанном порядке. Имена переменных массива начинаются со знака @.
  • Ассоциативные массивы Ассоциативные массивы или хэши, как их еще называют, похожи на массивы. Но главное отличие в том, что вы, программист, назначаете ключ и значение хешу, а массив автоматически назначает ключ. Хэши не сохраняют введенные элементы в том же порядке, в котором они были введены. Хеш-переменные всегда начинаются со знака%.

Как упоминалось выше, скалярные значения используются для отслеживания отдельных фрагментов информации. Наиболее часто используемая переменная Perl — $_ . Это специальное имя переменной называется переменной по умолчанию для многих функций Perl, поэтому ознакомьтесь с ней.

Мы можем видеть значение, присваиваемое скалярному значению в следующем примере вместе с интерполяцией.

 $var="my Scalar Variable"; 

print "Это $ var";

Вывод приведенного выше кода будет таким: This is my Scalar Variable

Массивы содержат список переменных и обрабатываются различными способами. Вы можете дать значения массиву во время инициализации:

 @array=('one','two','three'); 

Вышеупомянутый массив присваивает три значения в массив. Значения разделены запятыми. Первый индекс массива всегда равен 0, если вы не измените его специальной переменной $[ . Как правило, это не очень хорошая практика, потому что вы можете запутать людей, читающих ваш код. Чтобы прочитать значение, вы должны обратиться к имени массива и нижнему индексу, который вы хотите. Например, если бы мы хотели значение «два», мы бы сказали:

 print $array[1]; 

Мы говорим $array потому что мы ссылаемся только на одно значение, за которым следует открывающая скобка, нужный индекс, а затем закрывающая скобка. Это вернет второе значение в вашем массиве.

Хеши могут быть инициализированы аналогично массивам.

 %hash=('key1','value1','key2','value2','key3','value3'); 

Основное отличие состоит в том, что вы должны размещать значения в порядке значений ключей. Таким образом, первое введенное вами значение будет первым ключом; второе, ассоциированное значение; третий, второй ключ; и в-четвертых, значение, связанное с этим ключом. Процесс извлечения значения из хеша похож на массив, за исключением того, что вместо использования [ ] (квадратные скобки) мы будем использовать { } (фигурные скобки), а вместо номера индекса мы будем использовать ключ. Если бы мы хотели получить ‘value2’, мы бы использовали следующее:

 print $hash{'key2'}; 

Помните, что переменные Perl чувствительны к регистру, поэтому $ me, $ Me, $ mE и $ ME — это четыре отдельные переменные. Аналогично, если у вас есть скалярная переменная с именем $ me, массив с именем @me и хеш с именем% me, они будут интерпретироваться как три отдельные переменные, а не как одна и та же.

операторы

Perl поддерживает тот же набор операторов, что и большинство других компьютерных языков. Операторы позволяют компьютерному языку выполнять действия с операндами. Как и на любом компьютерном языке, операторы Perl также имеют определенный приоритет.

Мы уже сталкивались с оператором присваивания (=). Этот оператор присваивает значение из одной переменной в другую:

 $string1 = $string2; 

Приведенный выше код присваивает значение $ string2 для $ string1. Теперь рассмотрим бинарные и унарные арифметические операторы.

  • op1 + op2 Оператор сложения добавит два числа.
  • op1 - op2 Оператор вычитания op1 - op2 два числа.
  • op1 * op2 Оператор умножения умножит два числа.
  • op1 / op2 Оператор деления разделит два числа.
  • op1 % op2 Оператор модуля возвращает остаток от деления двух целочисленных операндов.
  • op1 xx op2 Оператор возведения в степень возведет op1 в степень op2.
  • ++op1 Оператор предварительного увеличения сначала увеличивает значение op1, а затем присваивает его.
  • op1++ Оператор op1++ увеличит значение op1 после его назначения.
  • --op1 Оператор предварительного декремента уменьшит значение op1 до его назначения.
  • op1-- Оператор после декремента уменьшит значение op1 после того, как оно назначено.

Логические операторы используются главным образом для управления потоком программы. Вот некоторые из логических операторов, которые поддерживает Perl:

  • && Оператор AND принимает два значения и вернет true, только если оба значения верны.
  • || Оператор OR принимает два значения и вернет true, только если хотя бы одно значение истинно.
  • ! Оператор NOT отрицает значение.
  • op1 == op2 Оператор equals проверяет равенство двух числовых значений.
  • op1 != op2 Этот оператор неравенства проверяет неравенство двух числовых значений.
  • op1 < op2 Этот числовой оператор вернет true, если op1 меньше, чем op2.
  • op1 > op2 Этот числовой оператор вернет true, если op1 больше, чем op2.
  • op1 <= op2 Этот числовой оператор вернет true, если op1 меньше или равен op2.
  • op1 >= op2 Этот числовой оператор вернет true, если op1 больше или равен op2
  • op1 <=> op2 Этот числовой оператор вернет -1, если op1 меньше, чем op2, вернет 0, если они равны, и вернет 1, если op2 больше, чем op1.
  • op1 eq op2 Этот строковый оператор вернет true, если две строки равны.
  • op1 ne op2 Этот строковый оператор вернет true, если обе строки не равны.
  • op1 lt op2 Этот строковый оператор вернет true, если op1 меньше, чем op2.
  • op1 le op2 Этот строковый оператор вернет true, если op1 меньше или равен op2.
  • op1 gt op2 Этот строковый оператор вернет true, если op1 больше, чем op2.
  • op1 ge op2 Этот строковый оператор вернет true, если op1 больше или равен op2.
  • op1 cmp op2 Этот строковый оператор работает так же, как и числовой оператор <=>, описанный выше.

Есть и другие операторы, которые также могут быть использованы в Perl. У нас есть оператор конкатенации для строк (.):

 $string1 . $string2 

Приведенный выше код объединит $ string1 с $ string2 для формирования новой строки.

У нас также есть оператор повторения (x), этот оператор будет повторять строку определенное количество раз, указанное:

 $string1 x 2; 

Приведенный выше код будет повторять $ string1 дважды.

Оператор диапазона позволяет нам использовать диапазоны в массивах или шаблонах:

 @array = (1..50); 

Приведенный выше код назначит 50 элементов для массива.

Как мы уже видели, у нас есть широкий спектр операторов, которые работают со скалярными значениями, но если бы мы хотели работать с массивами, мы могли бы сделать то, что называется «объединением массивов». Допустим, у нас есть массив с 10 значениями. Если мы хотим присвоить значения 5 и 6 двум скалярным значениям, мы можем сделать следующее:

 ($one,$two) = @array[4,5]; #remember that arrays start at subscript 0. 

В приведенном выше коде мы просто склеили два значения из массива. Когда мы выполняем сращивание массива, мы используем знак @, затем имя массива, затем скобки и нижние индексы, которые вы хотите разделить запятыми. Таким образом, вместо двух строк для приведенного выше кода у нас есть одна. Нам нужно заключить два скалярных значения в скобки, чтобы сгруппировать их.

функции

Функции используются для организации вашего кода на маленькие кусочки, которые можно использовать повторно. Perl объявляет функции, используя ключевое слово sub, за которым следует знак {, чтобы запустить функцию, и символ}, чтобы завершить ее:

 sub function1 {   CODE HERE   } 

Для вызова функции Perl рекомендуется вызывать ее с помощью знака &, за которым следует имя функции. Если у вас есть параметры, они также могут быть переданы, поэтому рекомендуется заключать их в скобки:

 &function1; 

В Perl функции могут служить процедурами, которые не возвращают значение (на самом деле они возвращают значение, но это будет обсуждаться позже), или функциями, которые возвращают значение. Приведенный выше пример имеет функцию, которая действует как процедура. Ниже приведен пример функции, которая действует как функция, потому что она возвращает значение (мы также передаем значения в функцию):

 $answer = &add(1,2); 

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

Функции Perl получают свои значения в массиве: @_

Этот массив содержит все значения параметров, переданных функции. Таким образом, в приведенном выше примере, где нам передали 2 значения, мы получили бы их следующим образом:

 sub function1 {   ($val1, $val2) = @_;   } 

или мы могли бы сделать это следующим образом:

 sub function1 {   $val1=$_[0];   $val2=$_[1];   } 

Параметры передаются по значению, что означает, что вы будете работать с копиями исходных параметров, а не самих параметров. Если вы хотите передать их по ссылке, вам придется работать непосредственно с переменной ( $_[subscript] ).

Область переменных Perl отличается от большинства других языков. Вам не нужно объявлять переменные в начале программы или в функциях: вы просто используете их. Область действия переменных всегда глобальна. Если вы используете переменную в функции, она является глобальной для остальной части программы. Если вы хотите, чтобы переменная была видна только кодом внутри этой конкретной функции (и любых других функций, которые она может вызывать), то вы должны объявить ее как локальную переменную:

 sub function1 {   local($myvar)   } 

Приведенный выше код объявит $ myvar как локальный, поэтому остальная часть программы его не увидит.

Функции также могут быть вложенными друг в друга, и вы можете создавать рекурсивные функции, которые вызывают сами себя.

Контрольные заявления

Perl имеет множество управляющих операторов, которые позволяют вам контролировать работу вашей программы и то, какие операторы контролируют каждый шаг.

Первое утверждение, которое мы рассмотрим, это утверждение if . Оператор if позволяет вам установить условие. Синтаксис:

 if (condition) {   STATEMENTS   } 

Логика такова: если условие возвращает истинное значение, то выполнить операторы в блоке, иначе ничего не выполнять. Оператор if выходит за рамки этого, позволяя вам использовать оператор else :

 if (condition) {   STATEMENTS   } else {   STATEMENTS   } 

Другая часть вышеприведенного оператора if будет выполнена только в том случае, если условие в нашем исходном операторе if ложно. Мы также можем улучшить это и добавить больше гибкости, используя несколько операторов if:

 if (condition){   STATEMENTS   } elsif (condition){   STATEMENTS   } else {   STATEMENTS   } 

Теперь мы можем запустить несколько тестов и выбрать из множества вариантов, что именно выполнять.

Другим типом управляющего оператора, который предлагает Perl, являются операторы цикла, которые позволяют нам выполнять блоки инструкций определенное количество раз. Давайте посмотрим на некоторые из этих утверждений:

Циклы while можно использовать несколькими способами. Мы можем проверить наше состояние в начале или в конце цикла. Синтаксис для проверки условия в начале цикла:

 while (condition) {   STATEMENTS   } 

Условие будет проверено первым. Если это правда, то операторы будут выполнены, в противном случае они будут пропущены. Если операторы выполняются, то условие проверяется снова, чтобы увидеть, должны ли они выполняться снова. Это продолжается до тех пор, пока условие не станет ложным.

Синтаксис для проверки условия в конце:

 do {   STATEMENTS   } while (condition); 

Если вы решите проверить в конце цикла, операторы будут выполняться по крайней мере один раз.

Другим типом цикла является цикл до . В отличие от цикла while, цикл before используется для выполнения определенных операторов, в то время как некоторое условие ложно. Но, подобно циклу while, мы можем проверить условие в начале и в конце цикла:

 until (condition) {   STATEMENTS   } 

Если мы хотим проверить условие цикла в конце:

 do {   STATEMENTS   } until (condition); 

Другой очень мощный цикл — цикл for . В отличие от циклов while и till, где мы не знаем, сколько раз мы будем повторять операторы, цикл for обычно используется для итерации определенного числа циклов. Синтаксис:

 for (INITIALIZATION; CONDITION; INCREMENT/DECREMENT) {   STATEMENTS   } 

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

Последний тип цикла, который мы обсудим, это цикл foreach . Поскольку одна из самых мощных вещей в Perl — это манипулирование массивами, мы, конечно, должны иметь цикл, который позволяет нам циклически проходить через массив или хэш. Синтаксис для цикла foreach:

 foreach LOOP_VAR (ARRAY) {   STATEMENTS   } 

Переменная LOOP_VAR является необязательной. Если ничего не указано, используется переменная по умолчанию $ _. ARRAY — это имя нашего массива. Если мы используем хеш, нам нужно иметь возможность получить скалярное значение, поэтому мы должны использовать функцию «ключи» или «значения» вместе с хешем, чтобы иметь возможность получить скалярное значение. Полученное значение сохраняется в LOOP_VAR (или $ _), которым мы можем манипулировать в наших инструкциях.

Есть также определенные ключевые слова, которые мы можем использовать в циклах:

последний : выпрыгивает из цикла сразу

next : пропускает остаток блока операторов и продолжает следующую итерацию цикла

redo : перезапускает блок операторов без проверки условия или выполнения операции увеличения / уменьшения

Перейти : переход к указанной метке

Управление файлами

Поскольку Perl является языком программирования, он имеет операции ввода-вывода. Но как это применяется к файлам? Файловый дескриптор — это имя в Perl-программе, которое связывает ввод-вывод между вашей Perl-программой и внешними программами.

Perl имеет три дескриптора файла по умолчанию, которые открываются автоматически. STDIN (стандартный ввод), STDOUT (стандартный вывод) и STDERR (для стандартной ошибки). Файловые дескрипторы имеют свое собственное пространство имен и не конфликтуют с переменными Perl. Рекомендация Ларри Уолла при объявлении файловых дескрипторов состоит в том, чтобы использовать имя в верхнем регистре.

Чтобы открыть дескриптор файла, вы должны использовать функцию open:

 open(FILEHANDLE,"filename"); 

FILEHANDLE — это имя нашего дескриптора, а «filename» — это имя файла, который мы хотим открыть. Функция возвращает истину, если она успешна, и ложь, если это не так.

Чтобы открыть файл для чтения, вы можете использовать любой из следующих двух синтаксисов:

 open(FILEHANDLE,"filename"); 

или

 open(FILEHANDLE,"<filename"); 

Для создания файла вы должны использовать следующий синтаксис:

 open(FILEHANDLE,">filename"); 

Чтобы добавить существующий файл, выполните следующие действия:

 open(FILEHANDLE,">>filename"); 

Чтение из файлового дескриптора довольно просто:

 open(FILEHANDLE,"test.txt");   while(<FILEHANDLE>){   print "line: $_\n";   } 

или

 @entire_file = <FILEHANDLE>; # this will read in the entire                             # file into the array 

или

 $one_line = <FILEHANDLE>; # this will read one line into                          # the scalar variable. 

Для записи в файловый дескриптор, который был открыт для записи, вы должны сделать следующее:

 print FILEHANDLE "This line will go into our output file"; 

Чтобы открыть файл в двоичном режиме, используйте функцию открытия таким же образом, как и раньше, за исключением этого времени, используйте одну дополнительную функцию:

 open(FILEHANDLE,"filename"); 

binmode (FILEHANDLE);

Функция binmode () вызывает обработку в двоичном режиме для данного дескриптора файла в системах, которые различают текстовые и двоичные файлы.

Как только мы закончили использовать дескриптор файла, мы должны закрыть его:

 close(FILEHANDLE); 

Если вы снова откроете дескриптор файла до его закрытия, он автоматически закроет предыдущий файл. То же самое произойдет при выходе из программы.

Есть также некоторые тесты файлов, которые вы можете запустить для определенного дескриптора файла или имени файла. Ниже приведены некоторые из них:

 File Test    Meaning   -r        File or directory is readable   -w        File or directory is writable   -x        File or directory is executable   -o        File or directory is owned by user   -e        File or directory exists   -z        File or directory exist and has zero size   -f        Entry is a plain file   -d        Entry is a directory   -T        File is "Text"   -B        File is "Binary" 

Примером использования одного из этих тестов может быть:

 open(FILEHANDLE,"text.txt");   if(-e FILEHANDLE) {   print "File exists.";   } 

или

 $filename = "/users/abc123/text.txt";   if(-e $filename){   print "File exists.";   } 

Как вы можете видеть, мы можем выполнить эти тесты файлов либо для дескриптора файла, либо для имени файла, который мы хотим.

Управление каталогами

Помимо возможности очень легко манипулировать файлами, Perl также позволяет очень просто манипулировать каталогами — почти как файлы.

Давайте начнем с некоторых основных вещей. Чтобы перейти в конкретный каталог, вы должны использовать функцию chdir (). Эта функция принимает один аргумент: имя каталога, на который вы хотите изменить.

 chdir("/home/abc123"); 

Если Perl может перейти в указанный каталог, то эта функция возвращает true; в противном случае возвращается false.

Вы можете создать список файлов в каталоге, используя оператор * вместе с оператором diamond (<>). Это называется скукой . Если я нахожусь в / home / abc123 / и мне нужен список всех существующих файлов, я бы сделал следующее:

 @files_found = </home/abc123/*>; 

или, чтобы отобразить только файлы Perl,

 @files_found = </home/abc123/*.pl>; 

Это даст вам имена всех файлов в каталоге, которые соответствуют указанному шаблону.

Вы также можете открыть каталог с помощью дескрипторов каталога. Чтобы открыть каталог, вы должны использовать функцию opendir ():

 opendir(DIRHANDLE,"/home/abc123"); 

Теперь вы можете использовать дескриптор каталога для манипулирования файлами с помощью функции readdir (). Это также даст вам доступ к именам файлов. Если вы вызываете функцию readdir () в скалярном контексте, он возвращает следующее имя файла в списке, если вы вызываете его в контексте массива, он возвращает список всех файлов в каталоге.

 $filename = readdir(DIRHANDLE); #returns one filename 

@filenames = readdir (DIRHANDLE); # возвращает список имен файлов

Как только вы закончили работу с каталогом, вы можете закрыть его с помощью функции closedir ():

 closedir(DIRHANDLE); 

Сопоставление с образцом

Сопоставление с образцом включает в себя поиск последовательности символов в строке символов. При выполнении сопоставления с образцом, если образец найден, то считается, что совпадение произошло.

Perl использует три основные функции для сопоставления с образцом (хотя сопоставление с образцом может использоваться в других функциях, таких как функция split ()). Это m //, s /// и tr ///.

Оператор m // является оператором совпадения. Этот оператор сообщит нам, если найдено совпадение, и синтаксис для использования этого оператора:

 m/PATTERN/OPTIONS 

PATTERN относится к последовательности символов, которую мы ищем, а OPTIONS — это альтернативные варианты выбора, которые можно сделать. При использовании оператора соответствия вы можете опустить их, если используете косую черту. Или, если вы не хотите использовать косую черту, вы можете заменить другого персонажа. Но помните: вы должны использовать косую черту, чтобы указать Perl использовать оператор сопоставления. Если вы используете разделитель шаблонов, который обычно является символом специального шаблона, вы не сможете использовать этот символ специального шаблона в шаблоне, который вы указываете для сопоставления. Вот пример:

 m!PATTERN!OPTIONS 

Оператор соответствия имеет определенные параметры, которые можно использовать:

 OPTION DESCRIPTION  g    Match all possible patterns  i    Ignore case  m    Test string as multiple lines  o    Only evaluate once  s    Treat string as single line  x    Ignore white space in pattern 

Оператор s /// известен как оператор замещения, синтаксис этого оператора:

 s/PATTERN/REPLACEMENT/OPTIONS 

PATTERN содержит шаблон, который мы хотим найти, а REPLACEMENT содержит значение, которое мы хотим использовать в качестве значения замены, когда найден шаблон, который мы ищем. Например:

 s/abc/xyz/ 

В приведенном выше примере мы определяем, что мы хотим искать «abc» в этом порядке, и заменяем его на «xyz». Вы также можете использовать переменные Pattern-Sequence в подстановках, которые будут обсуждаться позже. Оператор замещения также имеет опции, которые можно использовать:

 OPTION DESCRIPTION  g    Change all occurrences of the pattern  i    Ignore case in pattern  e    Evaluate replacement strings as expression  m    Treat string to be matched as multiple lines  o    Evaluate only once  s    Treat string to be matched as single line  x    Ignore white space in pattern 

Наконец, оператор перевода предоставляет нам другой метод для замены одной группы символов другой. Синтаксис оператора перевода:

 tr/STRING1/STRING2/OPTIONS 

Здесь STRING1 содержит список символов для замены, а STRING2 содержит символы, которые их заменяют. Первый символ в STRING1 заменяется первым символом в STRING2, второй символ — соответствующим номером в STRING2 и т. Д.

 tr/abc/def/ 

В приведенном выше примере abc является STRING1. a заменяется на d, b заменяется на e, c заменяется на f. Если вы хотите преобразовать все символы из прописных в строчные, вы должны использовать:

 tr/AZ/az/; 

Как видите, оператор диапазона поддерживается в операциях сопоставления с образцом. Еще раз оператор перевода также имеет опции, которые можно использовать:

 OPTION DESCRIPTION  c    Translate all characters not specified  d    Delete all specified characters  s    Replace multiple identical output characters       with a single character 

Помните, что если вы используете оператор косой черты, а шаблон содержит косую черту, то вы должны экранировать его, используя escape-символ «\».

Теперь давайте посмотрим, как мы строим шаблоны:

При сопоставлении с шаблоном по умолчанию ищется шаблон с использованием содержимого переменной по умолчанию ($ _). Чтобы использовать другую переменную, мы должны были бы использовать оператор сопоставления вместе с одной из трех функций, которые я упоминал ранее.

Оператор = ~ связывает шаблон со строкой в ​​левой части оператора. Это говорит о том, что паттерн следует искать в скалярной переменной.

 $string =~ m/hello/; 

Как показывает приведенный выше пример, мы ищем строку «hello» в переменной $ string. Если шаблон найден, то возвращается true (ненулевое значение), в противном случае возвращается false (значение 0).

Оператор! ~ Связывает шаблон со строкой в ​​левой части оператора и возвращает true, если шаблон не найден.

Теперь давайте обсудим специальные символы в шаблонах:

Символ + означает «один или несколько из предыдущих». Это означает, что если у нас есть шаблон:

 m/abc+/ 

он должен возвращать ‘true’, если совпадение найдено в abc, abcc, abccc, abcccc и так далее.

Символы [] позволяют вам определять шаблоны, соответствующие группе. Это означает, что все, что содержится в скобках, рассматривается как группа, из которой мы можем выбрать:

 m/a[bc]d/ 

Приведенный выше шаблон говорит, что мы найдем совпадение, если найдем «abd» или «acd».

Другим специальным символом является символ *, который означает «ноль или более из предшествующего». Это означает, что если у нас есть шаблон:

 m/ab*/ 

Мы найдем совпадения для «a», «ab», «abb», «abbb» и так далее.

? символ означает «ноль или одно вхождение предыдущего». Этот шаблонный символ работает так же, как оператор *, за исключением того, что максимальное количество символов, которое принимается, равно 1.

Вы также можете привязать шаблоны, используя операторы ^ и $.

Оператор ^ привязывает шаблон к началу строки:

 m/^The/ 

В приведенном выше примере мы найдем совпадение, если строка в строке начинается с «The» (или если вся строка начинается с «The», когда используется опция «s»). Если символ ^ используется в квадратных скобках и находится в начале, это означает «все, что не входит в эту группу». Так что будьте осторожны — смысл строки меняется, когда она заключена в скобки.

Оператор $ привязывает шаблон в конце строки, поэтому:

 m/end$/ 

В приведенном выше примере мы найдем совпадение, только если строка в строке заканчивается на «end» (или если вся строка заканчивается на «end» и используется опция «s»).

Привязки к шаблону со словом определяют, должен ли соответствующий шаблон быть на границе слова или внутри границы слова. Привязка шаблона \ b соответствует, только если указанный шаблон находится в начале или конце слова, тогда как привязка шаблона \ B соответствует, если указанный шаблон находится внутри слова.

При использовании диапазонов символов в скобках вы можете сократить процесс, используя специальные escape-последовательности диапазона символов:

 Sequence  Description                     Range Equiv.  \d      Any digit                       [0-9]  \D      Not a digit                     [^0-9]  \w      Any word character              [_0-9a-zA-Z]  \W      Anything not a word character   [^_0-0a-zA-Z]  \s      White space                     [ \r\n\r\f]  \S      Anything other than white space [^ \r\t\n\f] 

Если вы хотите сопоставить один символ, используйте «.» (точка) характер. Это будет соответствовать любому символу (кроме символа новой строки, когда опция ‘s’ не используется).

Если вы хотите сопоставить указанное количество вхождений, используйте символы {x, y} после символа, для которого вы хотите указать количество вхождений. Здесь х — это минимум, а у — максимум.

Чтобы указать альтернативы, используйте «|» персонаж.

Вы можете группировать части символов, используя символы (). Это также позволит вам позже использовать совпавший шаблон. Для этого используйте \ число, где число — это номер () в том порядке, в котором они были введены. Символы, сгруппированные с (), также могут иметь операторы, такие как +, *,? и {x, y} применяется к ним как к группе.

Это не полный учебник по сопоставлению с образцом, а введение в предмет. Для получения более подробной информации о сопоставлении с образцом попробуйте освоить регулярные выражения Дж. Фридла из O’Reilly.

Написание отчета

Как мы уже обсуждали в начале урока, Perl означает «Практическое извлечение и язык отчетности», и теперь мы обсудим использование Perl для написания отчетов.

Perl использует шаблон письма, называемый «формат», для вывода отчетов. Чтобы использовать функцию форматирования Perl, вы должны:

  1. Определить формат
  2. Передайте данные, которые будут отображаться в формате
  3. Вызовите формат

Определите формат следующим образом:

 format FormatName =  fieldline  value_one, value_two, value_three  fieldline  value_one, value_two  . 
  FormatName представляет название формата.  Полевая линия - это конкретный способ форматирования данных.  Строки значений представляют значения, которые будут введены в строку поля.  Вы заканчиваете формат с одним периодом.

  fieldline может содержать любой текст или держатели полей.  Владельцы полей хранят место для данных, которые будут размещены там позже.  Держатель поля имеет формат:

 @<<<< 

Этот держатель поля выровнен по левому краю с пробелом 5. Вы должны посчитать знак @ и знак <, чтобы узнать количество пробелов в поле. Другие владельцы поля включают в себя:

@>>>> Справедливо
@||||
в центре
@####.## держатель числового поля
@* многострочный держатель полей

Примером формата будет:

 format EMPLOYEE =  ===================================  @<<<<<<<<<<<<<<<<<<<<<< @<<  $name $age  @#####.##  $salary  ===================================  . 

Могут использоваться только скалярные переменные, но не массивы или хэши. Чтобы вызвать это объявление формата, мы использовали бы ключевое слово write:

 write EMPLOYEE; #send to the output 

Проблема заключается в том, что именем формата обычно является имя дескриптора открытого файла, и оператор write отправит выходные данные в этот дескриптор файла. Поскольку мы хотим, чтобы данные отправлялись в STDOUT, мы должны связать EMPLOYEE с дескриптором файла STDOUT. Сначала, однако, мы должны убедиться, что STDOUT - наш дескриптор выбранного файла, используя функцию select ():

 select(STDOUT); 

Затем мы бы связали EMPLOYEE с STDOUT, установив имя нового формата с помощью STDOUT, используя специальную переменную $ ~:

 $~ = "EMPLOYEE"; 

Когда мы сейчас сделаем write (), данные будут отправлены в STDOUT. Помните: если вы не установили STDOUT в качестве дескриптора файла по умолчанию, вы можете вернуться к исходному дескриптору файла, присвоив возвращаемое значение select скалярному значению и используя select вместе с этой скалярной переменной после специальной переменной присвоено имя формата, которое будет связано с STDOUT.