Perl для системного администрирования



              

Получение почты - часть 11


push(@blisttests, eval 'sub <$_[0] =" /\0$key/o and $key}');

Так что, если в черном списке есть запись spammer, ссылка на код, добавленная в массив, будет указывать на подпрограмму, по сути эквивалентную следующей:

sub {

$_[0] =" /\Qspammer/o and "spammer"; }

в начале регулярного выражения присутствует для того, чтобы точки (как в

.сот) или другие зарезервированные знаки пунктуации не считались бы метасимволами регулярных выражений.

Позже в программе будет обойден в цикле список ссылок на код и выполнена каждая маленькая подпрограмма для переданных данных. Если результатом каких-либо из этих вычислений окажется значение «истина», мы вернем код возврата подпрограммы:

return $found if (Sfound = &$subref($line));

Компиляция регулярного выражения, которая нас так беспокоит, происходит всего один раз - при создании ссылки на подпрограмму. Можно вызывать каждую подпрограмму столько раз, сколько надо, не теряя время на компиляцию регулярного выражения.

Существует и другой, чуть менее продвинутый подход, который можно применять, если у вас Perl версии 5.005 или выше. В Perl 5.005 была введена новая синтаксическая конструкция, названная «прекомпи-лируемым регулярным выражением», которая делает подобную задачу несколько проще. Переписать код, используя эту новую конструкцию, можно было бы примерно так:

sub loadblist{

tie %blist, 'BerkeleyDB::Hash', -Filename => $blacklist or die

"Невозможно открыть файл $Шегше:

 $BerkeleyDB: :Error\n" ;

while(my($key,$vaiue) = eac^- %blist){

# в черном списке могут бьть запис/ "OK". "RELAY" и пр. next

 (Svalue ne "PEJECT") push('SDlisttests, [qr/\Q$i<ey/. $кеу]): }

sub checkblisu

my($iine) = shift;

foreach my Stest (§blisttests){

my($re,$kr;v) = a{$test}

return $key i* ($line =" /$re/): }

return undef; }

На этот раз ссылка была перенесена на анонимный массив в@blist test. Первый элемент этого массива - скомпилированное регулярное выражение, созданное с применением нового синтаксиса qr/Y. Это позволяет сохранить регулярное выражение после его компиляции. Такая форма обработки значительно увеличивает скорость выполнения программы при дальнейшем поиске соответствия. Второй элемент анонимного массива - сама запись из черного списка, которая будет возвращена при найденном соответствии скомпилированному регулярному выражению.




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