Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

S/.../.../ - подстановка текста (substitution),




Tr/.../ - замена текста (translation).

 

Оператор m/.../ анализирует входной текст и ищет в нем подстроку, совпадающую с указанным шаблоном (он задан регулярным выражением). Оператор s/.../.../выполняет подстановку одних текстовых фрагментов вместо других при помощи регулярных выражений. Оператор tr/.../.../заменяет выходной текст, но при этом он не использует регулярные выражения, осуществляя замену посимвольно.

Оператор m/шаблон/ - поиск подстроки по определенному шаблону. Например

 

print "$1 г.\n" while m!((\d){4})!g

 

найдет и выведет все даты в переменной $_. В шаблоне не важно, что будет его ограничителем. Например, при поиске гиперссылок, которые зачастую содержат символы /, разумнее пользоваться не /, а, например, # или ! как символами ограничителями. В таком случае шаблон будет более прост для понимания другим программистам и немного короче. В perl оператор m/.../ используется очень часто, и поэтому используется сокращение без начальной буквы m. Если начальная буква есть, то в качестве символов ограничителей можно использовать любой другой символ.

Для оператора m/pattern/ есть 6 параметров (gimsxo):

 

m/foo/g говорит компилятору найти все foo в тексте, в то время как m/foo/ найдет только первое вхождение подстроки foo в строке $_. В строке $_ содержится обычный текст, как и в переменной $text$, $_ такая же переменная, только существует всегда и вводится, когда не определена специально другая по умолчанию.

Например, можно сказать

 

for (@mass){print $_,"\n"}

или

for $elem (@mass){print $elem,"\n"}.

 

Эти две строчки делают одно и то же, но в первом случае запись короче, да и зачастую бывает удобно использовать переменную $_, например, когда нужно выделить при помощи регулярного выражения определенные данные, пользуясь перебором массива(функция map):

 

@res=map{/(\d\d\d\d)/} split /\s/, $texts;

что эквививалентно коду

 

push @res, $1 while m!((\d){4})!g; #(в данном случае $_=$texts)

или что эквивалентно конструкции

 

foreach(split /\s/, $texts){

push @res, $1 if(/(\d\d\d\d)/g)

}

Следующий параметр m/foo/i, говорит о том, что не нужно учитывать регистр при поиске по подстроке.

Параметр m/foo/s говорит о том, что строка, по которой производится поиск, состоит из одной строчки.

Например, нужно выцепить все url картинок из странички www.astronomynow.com, чтобы сделать локальное зеркало этой странички, и пользователи могли с интересом читать последние новости астрономии:

 

#!/usr/bin/perl -wT

use LWP::Simple;

$page=get "http://www.astronomynow.com";

&getlink($page);

sub getlink{

local $_=$_[0];

push(@res, "http://$2")

whilem{SRC\s*=\s*(["'])http://(.*?)\1\s*(.*?)

}

 

В подпрограмме заводится при помощи функции local переменная, видимая только в области действия подпрограммы. Этой переменной присваивается значение переменной $page, в которой содержится текст выкачанной Simple.pm странички.

Можно сделать немного по-другому.Сохранить скачанную страничку в файл на диск и выполнить следующее:

 

$/="\001";

open F, "<page.html"; $page=<F>; close F;

&getlink($page);

...

Встроенная переменная $/ содержит символ разделителя входных записей. Это может быть перевод каретки или, при upload far'ом на сервер файлов в не ASCI виде, она приобретают на конце строчки хитрый символ ^M.

Если $/ переопределить, то можно свободно пользоваться дескрипторами открытия файлов для просмотра многострочного текста(m/pattern/s). Например, когда открывается файл при помощи функции open F, "<file.txt"; @mass=<F>, то присваивая дескриптор F массиву в массиве появятся строчки, разделенные символом, содержащимся в $/.

Переопределив $/ можно запросто написать:

 

open F, "<file.txt"; $mass=<F>

 

и в переменной $mass будет содержаться многострочный текст с точки зрения человека, но программа будет видеть этот текст как одну строку, и по тексту можно будет запросто пройтись поиском m/pattern/igs и выделить все необходимые подстроки.

Параметр m/foo/o говорит о том, что шаблон нужно компилировать только один раз. Если оператор используется в сочетании с операциями привязки =~ и отрицание !~, то строкой, в которой ведется поиск, является переменная, стоящая слева от операции привязки. В противном случае поиск ведется в строке $_.

Оператор s!pattern!substring! - поиск в строке по шаблону pattern и замена найденного текста на substring. Как и для оператора m/.../, косую черту можно не ставить, пригоден любой символ, который не находится в противоречии с заданным выражением. Не рекомендуется использовать в качестве ограничителей ? и '.

 

s!/usr/local/etc/!/some/where/else! - заменяет путь.

S(/usr/local/etc/)(/some/where/else)g - заменяет все встречающимеся пути до файла.


параметры: egimsxo e - указывает, что substring нужно вычислить.

Например, нужно переделать все escape последовательности.Для этого вызывается соответствующая подпрограмма:

 

$text =~ s/(&.*?;)/&esc2char($1)/egs;

 

т.е. из регулярного выражения происходит вызов подпрограммы.

g - заменить все одинаковые компоненты, а не один, как в отсутствии ключа g.

i - не учитывать регистр.

m - строка, в которой происходит поиск, состоит из множества строк.

s - строка, в которой происходит поиск, состоит из одной строки.

x - сложный шаблон, т.е. можно писать не в строчку, а для упрощения понимания разбивать шаблон на несколько строк, примеры об этом ниже.

o - компилировать шаблон один раз.

 

Допустим нужно сделать поисковик, который ходит по директориям на сервере, но некоторые директории типа /cgi-bin/ и т.п. индексировать нельзя. Объявляем переменную, которая будет содержать регулярное выражение, в данном случае перечисление или img или image или temp или tmp или cgi-bin:

 

$no_dir = '(img|image|temp|tmp|cgi-bin)';

 

Ключи регулярного выражения m#$no_dir$#io говорят о том, что компилировать содержимое $no_dir нужно только один раз(ключ o) и не учитывать регистр(ключ i).

 

Оператор tr/выражение1/выражение2/, ключи cds.

Смысл: замена выражения1 на выражение2. Если указан ключ с, то это инверсия выражения1, т.е. в выражение один не входят содержащиеся в нем символы. Если указан ключ d, то значит стереть замененные символы. Если указан ключ s, то значит заменить многочисленные повторяющиеся символы на одиночный символ.

 

Оператор y/выражение1/выражение2/(ключи cds), равносилен оператору tr.

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

 

$CAP_LETTERS = '\xC0-\xDF\xA8';

$LOW_LETTERS = '\xE0-\xFF\xB8';

$code = '$html_text =~ ';

$code .= "tr/A-Z$CAP_LETTERS/a-z$LOW_LETTERS/";

$down_case = eval "sub{$code}";

 


Одиночные символы

 

В регулярном выражении любой символ соответствует самому себе, если только он не является метасимволом со специальным значением (такими метасимволами являются \, |, (, ), [,{, *, +, ^, $, ? и .). В следующем примере проверяется, не ввел ли пользователь команду "quit" (и если это так, то прекращаем работу программы):

 

while(<>){

if(m/quit/){exit;}

}

 

Правильнее проверить, что введенное пользователем слово "quit" не имеет соседних слов, изменяющих смысл предложения. (Например, программа выполнит заведомо неверное действие, если вместо "quit" пользователь введет команду "Don't quit!".) Это можно сделать с помощью метасимволов ^ и $. Чтобы сравнение было нечувствительно к разнице между прописными и заглавными буквами, используем модификатор i:

 

while (<>)

{if (m/^quit$/i) {exit;} }

 

Кроме обычных символов perl определяет специальные символы. Они вводятся с помощью обратной косой черты (escape-последовательности) и также могут встречаться в регулярном выражении:

  • \077- восьмеричный символ;
  • - символ BEL (звонок);
  • \с[ - управляющие символы (комбинация Ctrl + символ, в данном случае это управляющий символ ESC);
  • \d - соответствует цифре;
  • \D - соответствует любому символу, кроме цифры;
  • - символ escape (ESC);
  • - конец действия команд \L, \U и \Q;
  • \f - символ прогона страницы (FF);
  • \1 - следующая литера становится строчной (lowercase);
  • \L - все последующие литеры становятся строчными вплоть до команды \Е;
  • \n - символ новой строки (LF, NL);
  • \Q - вплоть до команды \Е все последующие метасимволы становятся обычными символами;
  • \r - символ перевода каретки (CR);
  • \s - соответствует любому из "пробельных символов" (пробел, вертикальная или горизонтальная табуляция, символ новой строки и т. д.);
  • \S - любой символ, кроме "пробельного";
  • \t - символ горизонтальной табуляции (НТ, TAB);
  • \u - следующая литера становится заглавной (uppercase);
  • \U - все последующие литеры становятся заглавными вплоть до команды \E;
  • \v - символ вертикальной табуляции (VT);
  • \w - алфавитно-цифровой символ (любая буква, цифра или символ подчеркивания);
  • \W - любой символ, кроме букв, цифр и символа подчеркивания;
  • \x1B - шестнадцатеричный символ.

Bat также можете "защитить" любой метасимвол, то есть заставить perl рассматривать его как обыкновенный символ, а не как команду, поставив перед метасимволом обратную косую черту \. Обратите внимание на символы типа \w, \d и \s, которые соответствуют не одному, а любому символу из некоторой группы. Также заметьте, что один такой символ, указанный в шаблоне, соответствует ровно одному символу проверяемой строки. Поэтому для задания шаблона, соответствующего, например, слову из букв, цифр и символов подчеркивания, надо использовать конструкцию \w+, как это сделано в следующем примере:

 

$text = "Here is some text."

$text =~ s/\w+/There/;

print $text;

There is some text.

Классысимволов

 

Символы могут быть сгруппированы в классы. Указанный в шаблоне класс символов сопоставляется с любым из символов, входящим в этот класс. Класс - это совокупность символов, заключенных в квадратные скобки [ и ]. Можно указывать как отдельные символы, так и их диапазон (диапазон задается двумя крайними символами, соединенными тире). Например, следующий код производит поиск гласных:

 

$text ="Here is the text.";

if ($text =" /[aeiou]/) {print "Vowels: we got 'em.\n";}

Vowels: we got 'em.

 

Другой пример: с помощью шаблона [A-Za-z]+ (метасимвол + означает утверждение: "один или более таких символов") ищется и заменяется первое слово:

 

$text = "What is the subject.";

$text =" s/[A-Za-z]+/Perl/;

print $text;

Perl is the subject;

 

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

 

$text = "perl is the subject on page 493 of the book.";

$text =- s/[a-Za-z\s]+/500/;

print $text;










Последнее изменение этой страницы: 2018-04-12; просмотров: 365.

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