Регулярні вирази в Perl Регулярні вирази використовуються для знаходження шаблонів у рядках. Наприклад, для того, щоб знайти в телефонній книзі конкретне ім'я, або, наприклад, всі імена, починаючиающіеся з літери 'a'. Робота з регулярними виразами є однією з найбільш потужних і корисних, і в той же час самих складних для розуміння особливостей Perl. Сподіваємося, що після прочитання цієї статті ви зрозумієте, наскільки це потужний і зручний інструмент. Отримавши певний досвід ви зможете використаннять ці можливості з великою користю для себе. Оператори
Для роботи з регулярними виразами в Perl використовуються три оператора - Оператор порівняння (matching - m / /), оператор підстановки (substitution s / / /) та оператор переказу (translation - tr / //).
Всі три оператора використовують змінну $ _ за замовчуванням, тому далі, поки не будуть представлені операції = ~ і! ~, будем користуватися нею.
Оператор порівняння перевіряє, чи підходить перевіряємо вираз під шаблон, іповертає значення 1, якщо це так, і значення 0 у іншому випадку. Запис цього оператора складається з літери m, роздільник (найчастіше це косая лінія - /, але в принципі це може бути майже будь-який символ), шаблону і ще одного роздільник (такого ж, як і перший:).
Оператор порівняння $ _ =; if (m / hello /) ( print "hello user n"; )
if ($ input ( 'siteurl') = ~ # http:// #) ( print $ input ( 'siteurl'); )
У цьому прикладі перевіряється, чи є у рядку, отриманої з стандартного входу, слово 'hello'. Якщо це так (оператор m / / поверне значення 1), то на стандартний вихід повернеться фраза 'hello user'.
Примітка: взагалі-то символ 'm' є необов'язковим, тому оператор з цього прикладу може виглядаєеть просто як / hello /.
Оператор підстановки знаходить у рядку всі підстроками, що задовольняють шаблону, і заміняє їх деяким іншим значенням. Запис цього оператора складається з букви s, що вказує на те, що це власне оператор підстановки та вихідніого (що заміняти) і подстановочного (на що заміняти) шаблонів, розділених роздільниками.
Оператор підстановки $ _ = 'My name is Fred'; # Oh no, my name is Jonathan! s / Fred / Jonathan /;
У цьомуприкладі в рядку $ _ всі слова Fred будуть змінені на Jonathan.
Оператор перекладу також виробляє підстановки, але дещо іншого характеру - він використовується для заміни окремих символом деякими іншими (визначеними) символами. Синтаксис цього оперативнимира схожий на синтаксис оператора підстановки, з тим відмінністю, що по-перше він очевидно починається з літер tr, а між роздільниками вставляються НЕ шаблони, а групи символів, перший - вихідні символи, друга -- подстановочние, причому відповідні символи повинні стояти на продінакових позиціях у своїх групах - якщо ви хочете замінити, наприклад латинську 'm' на Кирилиця 'м', вони повинні стояти на однакових місцях: 'm' - у першій групі символів, 'м' - у другій.
Оператор перекладу $ _ = 'Hi.there, My.name.is.jonathan, '; tr /., /! /;
У цьому прикладі всі коми будуть змінені на знаки оклику, а точки - на пробiли. Модифікатори
Можливості кожного з ціх операторів можна розширити за допомогою модифікаторів. Модифікатори - це грубо кажучи символи які дописувати до оператора (наприклад, так - s / fred / Jonathan / i), говорячи про те, як йому потрібно розбирати робоче значення.
Модифікатори для оператора порівняння: g - знаходить всі знайдені підстроками; i - ігнорує регістр символів у рядку; m - розглядає рядок як багаторядкових значення; s - розглядає рядок як однострочое значення; x - дозволяє використовувати розширені регулярні вирази;
Модифікатори для оператора підстановки: e - обчислює подстановочное вираз перед підстановки; g - знаходить всі знайдені підстроками; i - ігнорує регістр символів у рядку; m - розглядає рядок як багаторядкових значення; s - розглядає рядок як однострочое значення; x - дозволяє використовувати розширені регулярні вирази.
Модифікатори
$ _ = 'My name is Fred'; s / fred / Jonathan / i; # My name is Jonathan s / jonathan / routine () / ie; # My name is [something] Операції = ~ і! ~
Операції = ~ і! ~ дозволяють використовувати з операторами m / /, s / / / і tr / / / будь-які змінні, а не тільки $ _, яка використовується цими операторами за замовчуванням.
Оператор = ~ </ strong> виконує ті ж функції, що й оператор присвоювання '=' (у разі використання з операторами s / / / і tr / / /) та оператор порівняння 'eq' (при використанні з оператором m / /).
Операція = ~ $ name = 'my name is Fred';
$ string = 'hello world'; if ($ string = ~ / hello / i) ( print 'helloworlded in this string.'; )
Аналогічно, операція! ~ Використовується так само як і операція 'ne' (її написання подібно операціі чисельного порівняння! =), використовується тільки з оператором порівняння і означає заперечення задоволення шаблоном.
Операція! ~ $ string = 'good'; if ($ string! ~ / bad /) ( print "hey, it's not too bad yet!"; ) </ p> Пам'ять
І наостанок - про можливості більш зручно працювати з результатами обробки регулярних виразів, а саме про зберіганні їх в окремих змінних. Такими змінними є існуючі$ & $ `, $ ', І набір змінних $ 1, $ 2, ..., $ 9.
Змінна $ &
Ця мінлива призначена для зберігання фрагмента рядка, який задовольнив шаблону, заданому регулярним виразом. Це зручно в таких слудеяких випадках, як, наприклад, якщо потрібно знайти число в рядку, але невідомо, що це за число. Ось як це може виглядати:
$ string = "error 404." $ string = ~ m / d + /; $ number = $ &; # $ number містить "404"
Змінні $ `и $ ' Ці змінні служать для зберігання фрагментів, які не удовлетворили шаблону, а саме підстроками, які стоять до і після результату відповідно. Іншими словами, після операції, наприклад, порівняння, значення результатом рядка розділяється натри частини - частина, яка підійшла під шаблон, і фрагменти, які йдуть перед нею і після неї. Ці частини і поміщаються в змінні $ &, $ `и $ ' відповідно. (Зверніть увагу на те, що в першій змінної -- зворотній лапках, а у другій - пряма). Подивимося на попередній приклад.
$ string = "error 404." $ string = ~ m / d + /;
$ number = $ &; # $ number містить "404" $ before = $ `; # $ before містить" error " $ after = $ '; # $ after містить "." Змінні $ 1 .. $ 9
Ці змінні служать для зберіганняфрагментів рядки, які удовлетворили відповідний певним фрагментах шаблону. В шаблоні фрагменти виділяються за допомогою дужок. Кожному фрагменту виділяється номер в тому порядку, в якому вони розташовані, та відповідна змінна буде містити його значення. $ string = "this is to be uppercased"; $ string = ~ s / (upper w +) / uc ($ 1) /; # $ String = "this is to be UPPERCASED"
$ string = "15 apples, 2 foos, 3 bars"; while ($ string = ~ m / ( d +) ( w +) / g) ( print "$ 2: $ 1 n"; ) # Виведе apples: 15 # Foos: 2 # Bars: 3 |