Perl - инструменти и похвати
Категория: Интернет
10.2.2002
В част 2 на нашия самоучител споменах, че използваме регулярни изрази, за да разложим пътя до файла на съставните му части, без да навлизаме в детайли как ще стане това.
Оказва се, че възможността за работа с регулярните изрази е една от най-мощните характеристики на Perl. Ако вършите каквато и да е работа, изискваща сериозна обработка на текстове, придобиването на опит в работата с регулярни изрази силно ще повиши вашата производителност. Регулярните изрази са полезни и извън света на Perl: повечето текстови редактори предоставят поне ограничена поддръжка на сравняването на текст с регулярни изрази, както правят мощните инструменти на Unix, действащи от команден ред, какъвто е grep.
Може да си представяте един регулярен израз като шаблон, на който се съпоставя текст, отговарящ на определени атрибути. По идея регулярните изрази са нещо като много по-мощна версия на познатите ни от DOS метасимволи ? и *, използвани в имената на файлове, които вероятно сте свикнали да използвате в командни редове или в диалогови прозорци за работа с файлове.
В най-простия си вид един регулярен израз просто се съпоставя на конкретна последователност от предварително зададени знаци. Нека например да добавим към нашата програма фрагмент от следния вид:
foreach my $this_file (@all_files) {
print $this_file if $this_file =~ m/readme/;
}
Операторът =~ означава приблизително следното “вземи нещата, които са ми отляво (в този случай съдържанието на променливата $this_file), и изпълни оператора за съпоставяне с образци, зададен вдясно, след което върни стойността, която може да бъде съхранена или проверена. Буквата m вдясно от =~ показва, че искаме да извършим сравняване, а наклонените черти ограничават регулярния израз, с който имаме намерение да направим сравняването.
Показаният в този пример регулярен израз /readme/ ще извърши сравняване с всеки низ, съдържащ непрекъснатата последователност от знаци readme. Следователно файлове като readme.txt, както и please-readme.html, разбира се, ще съответстват, но read-this-first.txt няма да съответства на образеца. Няма да съответства и README.TXT, тъй като по подразбиране при съпоставянето на регулярни изрази има значение изписването с малки и главни букви.
Както показва този пример, буквено-цифровите знаци в регулярните изрази просто съответстват на себе си. По-интересно става, когато във вашите регулярни изрази започнете да използвате специални метасимволи. Символът за конвейер (|) например означава “ИЛИ”:
print $this_file if $this_file =~ m/readme|info|instructions/;
Този регулярен израз ще съответства на всеки файл, съдържащ някоя от последователностите от знаци readme, info или instructions. Във вашия регулярен израз може да вмъквате и метасимволи:
print $this_file if $this_file =~ m/rea.me/;
Точката (.) означава “съвпадение с точно един-единствен знак”. Така че този регулярен израз ще съответства наред с останалите неща и на readme.txt, и на realme.doc.