Если интервальные операторы Perl покажутся
%seen = (); while (о) {
next unless /"From:?\s/i .. /"$/;
while (/(["<>(),;\s]+\@["<>().;\s]+)/g) { print "$1\n" unless $seen{$1}++;
Если интервальные операторы Perl покажутся вам странными, записывайтесь в команды поддержки s2p и а2р — трансляторов для переноса кода sed и awk в Perl. В обоих языках есть свои интервальные операторы, которые должны работать в Perl.
> Смотри также---------------------------------------------------------------------------------------------
Описание операторов .. и ... в разделе «Range Operator» perlop(i); описание переменной $NR в perlvariX).
Проблема
Вы хотите, чтобы вместо регулярных выражений Perl пользователи могли выполнять поиск с помощью традиционных универсальных символов командного интерпретатора. В тривиальных случаях шаблоны с универсальными символами выглядят проще, нежели полноценные регулярные выражения.
Решение
Следующая подпрограмма преобразует четыре универсальных символа командного интерпретатора в эквивалентные регулярные выражения; все остальные символы интерпретируются как строки.
sub glob2pat {
my $globstr = shift, my %patmap = (
'• =>'.*,
">¦ => ' ',
¦[ => •['. ¦]• => ¦]•
);
Sglobstr =" s{(.)} < $patmap{$1> || '\0$1- }ge; return " Sglobstr . '$'; }
Комментарий
Шаблоны Perl отличаются от применяемых в командных интерпретаторах конструкций с универсальными символами. Конструкция * * интерпретатора не является допустимым регулярным выражением. Она соответствует шаблону /". *\.. *$/, который совершенно не хочется вводить с клавиатуры.
Функция, приведенная в решении, выполняет все преобразования за вас. При этом используются стандартные правила встроенной функции glob.
Интерпретатор Perl
list 1 |
"list\. $ |
|
project * |
"project\ |
4 |
•old |
" *old$ |
|
type* [ch] |
"type *\ |
[ch]$ |
* * * |
- Л 4 |
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий