PERL: БИБЛИОТЕКА ПРОГРАММИСТА



              

PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 192


%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).


200   Глава 6 • Поиск по шаблону

6.9. Работа с универсальными символами командных интерпретаторов

Проблема

Вы хотите, чтобы вместо регулярных выражений 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




Содержание  Назад  Вперед