Регулярные выражения (сопоставление с образцом)
Самым интересным средством Perl является механизм регулярных выражений, сравнение с образцом и подстановки, которые он унаследовал от таких типичных для Unix-систем утилит, как awk и sed.
Операция сопоставления с образцом задается как "=~":
$query =~ /target/;
В данном случае в скаляре $query отыскивается подстрока "target". С операцией "=~" связано два действия по умолчанию. Во-первых, операция сопоставления в полной форме будет записана как
$query =~ m/target/;
То есть перед шаблоном используется префикс m. Во-вторых, если опустить $query, то образец будет сопоставляться с содержанием системной переменной $_:
/target/;
Операция "=~" возвращает значение "истина"(true), если образец был найден, и "ложь"(false), в противном случае. Из этого следует, что данную операцию можно использовать в операторах ветвления:
if($query =~ /target/) { print $query; }
В данном случае, если образец содержится в $query, то запрос печатается, не содержится — пропускается при печати.
При сопоставлении с образцом одновременно осуществляется разбор запроса: шаблон попадает в переменную $_, часть строки до найденного шаблона — в $`, а после образца — $'. Но для программирования разбора данных из формы больше подойдет следующий пример (perlexp1.htm):
http://intuit.ru/scripts/ script?n1=v1&n2=v2&n3=v3 ... ($v1,$v2,$v3) = ($query =~ /^n1=(.+)&n2=(.+)&n3=(.+)$/); print $v1,$v2,$v3;
В переменные $v1 — $v3 будут записаны значения полей n1-n3, соответственно. При этом символ "^" означает, что весь шаблон должен стоять вплотную к началу строки. Символ "$" в конце шаблона означает, что шаблон должен распространяться на всю строку до конца. Символ "." означает любой символ, входящий в таблицу символов, "+" означает любое количество этих символов, но не менее одного.
Еще более мощным средством является подстановка, которая базируется на механизме сопоставления с образцом. Для ее осуществления следует использовать префикс s%
$query =~ s/intuit/ruru/;
В данном случае, если в строке будет найден шаблон intuit, он будет заменен на ruru. Наиболее очевидной областью применения подстановки является перекодировка запросов form-urlencoded:
$query =~ s/%(.{2})/pack('c',hex($1))/eg;
Спецсимволы и символы из второй половины таблицы ASCII при передаче трансформируются в шестнадцатеричные описания байтов (две цифры), следующие после символа "%".