'

Лекция 9

Понравилась презентация – покажи это...





Слайд 0

Лекция 9 Регулярные выражения Операторы и приоритеты


Слайд 1

Регулярные выражения Регулярные выражения в Perl чаще всего используются в операторах поиска и замены, таких как s/, m/, операторах связки =~ или !=. Эти операторы имеют схожие опции:


Слайд 2

Регулярные выражения Эти опции, обозначаемые как '/x', можно использовать внутри шаблонов, используя конструкцию (?...). В шаблонах используются следующие метасимволы (символы, обозначающие группы других символов):


Слайд 3

Регулярные выражения Метасимволы имеют модификаторы (пишутся после метасимвола):


Слайд 4

Регулярные выражения Во все других случаях фигурные скобки считаются обычными (регулярными) символами. Таким образом '*' эквивалентна {0,} , '+' - {1,} и '?' - {0,1}. n и m не могут быть больше 65536. По умолчанию действие метасимволов "жадно" (greedy). Совпадение распространяется столько раз, сколько возможно, не учитывая результат действия следующих метасимволов.


Слайд 5

Регулярные выражения Если вы хотите "уменьшить их аппетит", то используйте символ '?'. Это не изменяет значение метасимволов, просто уменьшает распространение.


Слайд 6

Регулярные выражения Шаблоны работают так же, как и двойные кавычки, поэтому в них можно использовать `\` - символы (бэкслэш-символы):


Слайд 7

Регулярные выражения


Слайд 8

Регулярные выражения В Perl добавлены следующие метасимволы:


Слайд 9

Регулярные выражения Обратите внимание - все это "один" символ. Для обозначения последовательности применяйте модификаторы. Так:


Слайд 10

Регулярные выражения Существуют мнимые метасимволы, обозначающие места смены значения:


Слайд 11

Регулярные выражения Граница слова (\b) - это мнимая точка между символами \w и \W. Внутри класса символов '\b' обозначает символ backspace (стирания). Метасимволы \A и \Z - аналогичны '^' и '$', но если начало строки '^' и конец строки '$' действуют для каждой строки в многострочной строке, то \A и \Z обозначают начало и конец всей многострочной строки.


Слайд 12

Регулярные выражения Если внутри шаблона применяется группировка (круглые скобки), то номер подстроки группы обозначается как '\цифра'. За шаблоном в пределах выражения или блока эти группы обозначаются как '$цифра'.


Слайд 13

Регулярные выражения Рассмотрим пример: $s = "Один 1 два 2 и три 3"; if ($s =~ /(\d+)\D+(\d+)/) { print "$1\n"; # Результат '1' print "$2\n"; # '2' print "$+\n"; # '2' print "$&\n"; # '1 два 2' print "$`\n"; # 'Один ' print "$'\n"; # ' и три 3' }


Слайд 14

Регулярные выражения Perl версии 5 содержит дополнительные конструкции шаблонов:


Слайд 15

Регулярные выражения Пример - Конструкции шаблонов. $s = "1+2-3*4"; if ($s =~ /(\d)(?=-)/){ print "$1\n"; } else { print "ошибка поиска\n";} $s = "1+2-3*4"; if ($s =~ /(\d)(?!\+)/) { print "$1\n";} else { print "ошибка поиска\n";}


Слайд 16

Регулярные выражения Правила регулярного выражения.(regex) Любой символ обозначает себя самого, если это не метасимвол. Если вам нужно отменить действие метасимвола, то поставьте перед ним '\'. Строка символов обозначает строку этих символов. Множество возможных символов (класс) заключается в квадратные скобки '[]', это значит, что в данном месте может стоять один из указанных в скобках символов. Если первый символ в скобках это '^' - значит, ни один из указанных символов не может стоять в данном месте выражения.


Слайд 17

Регулярные выражения Правила регулярного выражения.(regex) Внутри класса можно употреблять символ '-', обозначающий диапазон символов. Например, a-z - одна из малых букв латинского алфавита, 0-9 - цифра. Все символы, включая специальные, можно обозначать с помощью '\' как в языке С. Альтернативные последовательности разделяются символом '|' Заметьте что внутри квадратных скобок это обычный символ. Внутри регулярного выражения можно указывать "подшаблоны" заключая их в круглые скобки и ссылаться на них как '\номер' Первая скобка обозначается как '\1'.


Слайд 18

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


Слайд 19

Операторы и приоритеты. Если скобки отсутствуют, то приоритет списковых операторов или наивысший или наименьший в отношении операторов справа или слева от него. Пример: @i = ('a ','b ', print 'c ', 'd '); print "\n",@i,"\n"; Здесь для запятых слева от print он имеет наименьший приоритет, но повышает приоритет правой запятой. Поэтому правая запятая воспринимается как параметр для print и печатается 'c d', а левая просто записывает код завершения операции в массив @i и последний print показывает это.


Слайд 20

Операторы и приоритеты. Оператор '->' Как и в С - это инфиксный оператор переадресации. Если справа от него стоит [...] или {...} выражение, то правая часть может быть непосредственной или символической ссылкой на массив или хеш. В противном случае правая сторона это метод или простой скаляр, содержащий имя метода, а правая - или объект, или имя класса.


Слайд 21

Операторы и приоритеты. Операторы ++ и --. Работают, как и в С. Употребление инкремента к строковым переменным в Perl имеет особенность. Каждый символ остается в своем классе (большие, малые, цифры) и учитывается перенос предыдущего символа. Таким образом, строковые переменные с цифрами работают как числовые переменные. Пример: print ++($i = "09"); # "10" print ++($i = "a9"); # "b0" print ++($i = "az"); # "ba" print ++($i = "aZ"); # "bA"


Слайд 22

Операторы и приоритеты. Оператор ** (возведение в степень): print 4**2 # Результат 16 print -4**2 # Результат -16 Унарные операторы. '\' - получение ссылки на переменную (как & в С) Мультипликативные операторы. 'x' - оператор повторения. В скалярном контексте возвращает строку левой части, повторенную величиной, указанной в правой части. print '*' x 5; # '*****' print (1,2) x 3; # 121212 Пример:


Слайд 23

Операторы и приоритеты. Операторы "привязки" =~ и !=. Эти оригинальные операторы имеют очень широкое применение в Perl. Оператор =~ логически связывает левую часть выражения с патерном (pattern - шаблон) в правой. По умолчанию поиск или изменение по патерну выполняется в переменной $_. Операторы привязки позволяют делать это с любой переменной, указанной в левой части. Логическим результатом будет успех операции.


Слайд 24

Операторы и приоритеты. Если в правой части вместо патерна присутствует выражение, то результат этого выражения воспринимается как патерн. Однако это не очень эффективно, т.к. патерн будет компилироваться во время исполнения программы, что заметно снизит быстродействие. Оператор != аналогичен =~, только результат совпадения инвертируется (логическое "нет").


Слайд 25

Операторы и приоритеты. Операторы отношений. Кроме стандартных, имеются следующие:


Слайд 26

Операторы и приоритеты. Логические операторы && (AND) и || (OR). Отличие от подобных операторов в С заключается в том, что в С возвращаемое значение либо 0, либо 1, тогда как в Perl возвращается результат выражения.


Слайд 27

Операторы и приоритеты. Оператор диапазона '..' В списковом контексте результат - список с элементами, первый элемент которого это левое выражение и последнее - правое. Значение каждого элемента внутри списка увеличивается на 1. for $i (1..4) { print "$i "; } В скалярном контексте результат - логическое значение. Это false до тех пор, пока левый операнд false. Как только он стал true, результат - true до тех пока правый true, после чего опять - false.


Слайд 28

Операторы и приоритеты. Операторы ограничители строк. В Perl это операторы, выполняющие разного рода интерполяцию и поиск по шаблону. Фигурные скобки '{}' обозначают любой символ, используемый для ограничителя. В случае использования скобок (круглых '( )', квадратных '[ ]', фигурных '{ }', угловых '< >') в начале ставится открывающаяся скобка, а в конце закрывающая. В строках, допускающих интерполяцию, имена переменных, начинающиеся с символов '$' или '@' - интерполируются, т.е. в строку вставляется значение строки или массива.


Слайд 29

Операторы и приоритеты.


Слайд 30

Операторы и приоритеты. m/PATERN/gimosx, /PATERN/gimosx Поиск в строке по патерну (шаблону). В скалярном контексте возвращает логическое значение true (1) или false (''). Если строка не указана с помощью операторов '=~' или '!~', поиск ведется в строке $_. Опции:


Слайд 31

Операторы и приоритеты. Если '/' - ограничитель, то начальное 'm' можно опустить. PATTERN может содержать переменные, которые будут интерполироваться каждый раз в момент вычисления. Переменные $) и $| не интерполируются. Если хотите, чтобы шаблон интерполировался один раз - ставьте /o. Если PATERN - нулевая строка, используется последнее регулярное выражение. В скалярном контексте возвращается список, элементы которого - результаты выполнения выражений в скобках патерна ($1, $2, $3...). Обратите внимание, что первый элемент $1.


Слайд 32

Операторы и приоритеты. $a = "/usr/local/perl/perl.bin"; @dirs=($a=~ m[/(\w*)/(\w*)/(\w*)/(\w*)]); Здесь 'm[' - использовать квадратные скобки как ограничители, (\w*)- шаблон алфавитно-цифровой последовательности. В результате @dirs равен ('usr', 'local', 'perl')


Слайд 33

Операторы и приоритеты. q/строка/, 'строка' - Строка литералов. Не интерполируется. Внутри строки - \' или \\ для обозначения символов ' и \ : print 'O\'K'; # O'K qq/строка/, "строка" - Интерполируемая строка: $var = 13; print "\$var = $var"; qx/строка/,`строка` - интерполируется, а потом выполняется как системная команда: print `date`; qw/строка/ Возвращает список, элементы которого - слова строки, разделенные пробелами


Слайд 34

Операторы и приоритеты. s/шаблон/подстрока/egimosx Поиск по шаблону и в случае успеха замена подстрокой. Возвращает количество произведенных подстановок, иначе false (0). Если строка в которой ведется поиск не указана (операторы =~ или != ), то используется переменная $_ . Если в качестве разделителя '/' использовать одинарную кавычку ('), то интерполяции не будет, иначе можно применять переменные в шаблоне или подстроке. Опции:


Слайд 35

Операторы и приоритеты. Пример и его результат


Слайд 36

Операторы и приоритеты. tr/таблица1/таблица2/cds, y/таблица1/таблица2/cds Замена всех символов из "таблица1" на соответствующий символ из "таблица2". Результат - количество замен или стираний. Без оператора =~ или != операция выполняется со строкой $_. Опции: Пример и его результат


Слайд 37

Операторы и приоритеты. Операторы ввода-вывода. Первый - скобки из символа '`'. Строка в скобках воспринимается как системная команда и ее результат возвращается как литерал. В скалярном контексте это строка, содержащая весь результат, а в списковом - список, элементы которого - строки результата. Статус выполненной команды хранится в переменной $?. Следующая команда - '<файл>'. Вычисление <файл> приводит к чтению строки из файла. 'файл' здесь не имя файла, а указатель файла, который создается функцией open().


Слайд 38

Операторы и приоритеты. В скалярном контексте читается одна строка вместе с символом '\n', а в списковом - весь файл читается в список, элементы которого - строки файла. В случае обнаружения конца файла результат оператора - false. Если не указана переменная результата, то это $_. Указатель файла по умолчанию STDIN: while(<>) { print; }; Если в командной строке нет никаких аргументов, то читается стандартный ввод, если есть аргументы, то они считаются именами файлов, которые последовательно читаются.


Слайд 39

Операторы и приоритеты. Если в угловых скобках записана переменная, то содержимое этой переменной считается именем указателя файла или ссылкой на указатель файла. Если такого указателя не существует, то содержимое переменной воспринимается как шаблон имен файлов и результат - имена файлов на диске, подходящих по шаблону: while(<*.pl>) { print;}; @files = <*>; но лучше сделать: @files = glob("*"); т.к. внутри скобок можно использовать переменные.


×

HTML:





Ссылка: