Учебные материалы по математике | Программирование на perl — дизъюнкция | Matematiku5
Вузы по математике Готовые работы по математике Как писать работы по математике Примеры решения задач по математике Решить задачу по математике online

Программирование на perl — дизъюнкция


5.  Круглые скобки для запоминания

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

Пример:

(a)  – соответствует букве а;

([a-z]) – любой строчной букве.

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

Пример:

/fred(.)lena1/

Это соответствует строке, состоящей из fred, любого символа, кроме n, слова lena и еще одного того же символа, то есть fredxlenax, но не fredxlenay.

Если /fred. lena./, то на месте точек могут быть одинаковые символы, а могут быть и разные.

Сколько в РВ круглых скобок, столько чисел можно применять для сопоставления. Запоминаться может не только один символ, но и часть строки. Например,

/a(.*)b1c/ =>

—  abc, когда.* пусто

—  aLENAbLENAc

Но не будет при axxbxxx, так как в начале только два символа хх, а потом их три.

6.  Дизъюнкция

Эта групповая конструкция соответствует одному из указанных вариантов. Например:

/a|b|c/ => a или b или c;

/green|red/ => зеленый или красный;

Причем для односимвольных образцов лучше применять класс

/a|b|c/ = /[abc]/

Фиксирование образца

Они позволяют вести поиск

—  либо на границе слова;

—  либо не на границе слова;

—  либо в начале строки;

—  либо в конце строки.

1.  На границе слова — b

В этом случае совпадение будет только на границе слова. Граница слова – это место между символом, которое соответствует предопределенномым классам w и W, либо между символамм, которые соответствуют классу w, а также началу или концу строки.

Пример:

/fredb/ => fred, но не frederick;

/bmo/ => moe, mole, но не elmo;

/bfredb/=> fred, но не frederick или alfred.

2.  Не на границе слова — B

Требует, чтобы в указанной точке границы слова не было

/bfredB/ => frederick, но не fred Smith.

3.  Начало строки — ^

Символ ^ обозначает начало строки, если стоит в месте, где сопоставление с началом строки имеет смысл, то есть:

^a – если a – первый символ в строке;

a^ — это два символа "а" и "^". Здесь символ ^ утратил свое специфическое назначение.

Вместо ^ можно A.

4.  Конец строки — $

Фиксирует образец по концу строки. Например,

c$ соответствует c в конце строки или перед символом новой строки.

$c говорит о том, это переменная скаляр.

Вместо $ можно Z.

Отличие ^ и $ от A и Z в том, что первые действуют для каждой строки в многострочной строке, а вторые – обозначают начало и конец всей многострочной строки.

Есть и другие фиксируюшие точки, включая A,Z и упреждающие фиксируюшие точки, создаваемые с помощью коибинаций (?=…)или (?!…), что будет рассмотрено позже.

Приоритет

Если образец имеет вид

/a|b*/

то что будет отыскиваться: любое количество a или b или один символ a и любое количество b?

  Таблица приоритетов

Наименование

Обозначение

Круглые скобки

()(?:)

Множители

?+*{m, n}

??+?*?{m, n}?

Последовательность и фиксация

abc^

Дизъюнкция

|

Приоритет уменьшается сверху вниз.

В этом случае наш пример означает второе, то есть один символ а и любое количество символов в. Для реализации первого надо сделать так:

(a|b)*

Изменение приоритета

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

(?:)

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

/(?:FredWilma) Smith/

Здесь нет запоминания, а только указание приоритета.

  Выбор другого объекта для сопоставления

Для того, чтобы работать со строкой, отличной от $_, применяют операцию =~.

Примеры:

$a="hello world!";

$a=~/^he/ соответствует, что выражение будет истиной.

$a=~/(.)1/ соответствует истине, так как в строке есть ll.

Слева от знака =~ может стоять любое выражение, которое дает скалярное строковое значение, например <STDIN>.

if (<STDIN>=~/^[yY]/) соответствует поиску, начинаются ли входные данные с буквы y?

  Игнорирование регистра

Для коротких строк можно делать, как выше:

[yY], [fF], [rR]

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

/образец/i

Например,

/^procedure/i => поиск слова procedure или PROCEDURE.

Использование другого разделителя

Для того, чтобы найти строку с названием каталога

/usr/bin/etc

надо перед каждой / ставить обратный слеш .

if ($path=~/^/usr/bin/etc/)

В Perl есть возможность применять другой разделитель. Для этого перед символом разделителей надо поставить букву m. Например,

m@^/usr/bin/etc@ => разделитель @ или

m#^/usr/bin/etc# => разделитель #.

Для использования слешей надо использовать

m/fred/ или в этом случае mможно не записывать. По умолчанию разделитель – это слеш, поэтому m можно не ставить.

Если в качестве разделителя – парные элементы (круглые, фигурные, квадратные или угловые скобки), то делают так

m[^/usr/bin/etc]

то есть после m левая скобка, а в конце – правая.

Интерполяция переменных

Перед сопоставлением в РВ происходит интерполяция переменных. Поэтому РВ можно строить не только из литералов, но и из вычисляемых строк.

Пример:

$h="bird";

$st="Every good bird does fly.";

if ($st=~/b$hb/)

{ print "The variable st contents the word $h!n";

}

Здесь использовались ссылки на переменную $h для построения РВ. Причем слово "bird" ищется как слово, иак как есть управляющие конструкции b$hb.

В РВ значение переменной может прийти из ввода, например:

chomp($h=<STDIN>);

Если будет введено "bird" или [bw]ird, то результаты поиска будут успешными. То есть, если при вводе будут указаны квадратные скобки, то они будут воприниматься как символы указания класса для сопоставления. Чтобы избежать этого, надо перед ними поставить обратные слеши. В этом случае при поиске будут искаться и квадратные скобки.

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

Пример:

$h="[box]"

foreach (qw(in[box] out[box] white[box]))

# то есть будет "in[box]","out[box]", "white[box]"

{ if (/Q$hE/)

{ print "$_ matchedn";

}

}

1.  В цикле нет введенной переменной, работает встроенная $_.

2.  qw переводит в элементы строк "in[box]" и другие элементы.

3.  Если в РВ не указывать обратные слеши, то мы бы искали b|o|x, то есть одну из этих букв.

4.  Вместо указания обратных слешей, мы применяем управляющий символ Q, который автоматически обрамляет все не буквы и не цифры в обратные слеши, т. е. конструкция Q$hE превращается в [box].

После успешного сопоставления значения, что присваивались 1, 2 и так далее, присваиваются и переменным $1,$2,$3 и так далее. Эти переменные можно использовать в дальнейшем коде программы. Доступ к этим переменным можно получить и при сопоставлении списков, то есть может быть получен список значений от $1 до $n, где n – количество круглых скобок в РВ.

Пример 1:

$_="This is a test";

/(w+)W+(w+)/; =>

$1= This

$2= is

Пример 2:

$_="This is a test";

($first,$second)=/(w+)W+(w+)/;

Здесь получим

$first = This

$second = is

Кроме этих переменных при сопоставлении можно использовать переменные:

$& — часть строки, совпадающая с РВ;

$` — часть строки, стоявшая перед совпавшей частью;

$’ — часть строки, стоявшая после совпавшей части;

$+ — обозначает последнее совпадение.

Пример:

$_="Один 1 два 2 и три 3";

/(d+)D+(d+)/

целое целое

не число

$1 = 1

$2 = 2

$+ = 2

$` = "Один"

$’ = "и три 3"

$& = 1 два 2

В Perl 5 есть еще дополнительные шаблоны:

1.  (?#комментарий) – комментарий в теле шаблона.

2.  (?=шаблон) – заглядывание вперед. Например,

/w+(?=t)/

Ищется слово, за которым идет табуляция, но символ ‘t’ не включается в результат.

3.  (?!шаблон) – заглядывание вперед по отрицанию.

Пример 1:

$_="1+2-3*4";

/(d)(?=-)/

Найти цифру, за которой стоит "-", то есть будет 2.

Наташа

Автор

Наташа — контент-маркетолог и блогер, но все это не мешает ей оставаться адекватным человеком. Верит во все цвета радуги и не верит в теорию всемирного заговора. Увлекается «нефрохиромантией» и тайно мечтает воссоздать дома Александрийскую библиотеку.

Распродажа дипломных

 Скидка 30% по промокоду Diplom2020