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



              

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


вообразите себе внешний цикл, в котором этот код вызывается

множество раз

foreach Smatch (qw(alewife davis porter harvard central кепааН park))

{

Sstation =" /Smatch/ and print "found our station stop'": }

Этот процесс требует больших вычислительных затрат, так что если бы можно было сократить количество вычислений, программа стала бы намного эффективней. Время, потраченное на компиляцию регулярных выражений, становится значительным в программах, где в цикле рассматривается список различных регулярных выражений.

Вот пример первой технологии, созданной для решения указанной проблемы:

use BerkeleyDB;

Sblacklist = "/etc/mail/blacklist.db";

&loadblist;

и принимаем имя узла в качестве аргумента командной строки и

 сообщаем, если оно есть в черном списке

if (defined &checkblist($ARGV[0])){

print "*** $found найден в черном списке \п"; }

И

загружаем черный список в массив анонимных подпрограмм sub loadblist{

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

"Невозможно открыть Sfilename:

$! $BerkeleyDB::ErrorXn" ;

while(my($key,$value) = each %blist){

# в черном списке могут быть "OK", "RELAY" и пр. next if ($value ne "REJECT");

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

sub checkblist{

my($line) = shift:

foreach Ssubref (@blisttests){

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

return undef: }

В этом примере используются анонимные подпрограммы - технология, продемонстрированная в книге Джозефа Хола (Joseph Hall) «Effective Perl Programming» (Эффективное программирование на Perl) (Addison Wesley). Для каждой записи из черного списка создается анонимная подпрограмма. Каждая подпрограмма сверяет переданные ей данные с одним из элементов черного списка. Если они совпадают, такая запись возвращается. Ссылки на эти подпрограммы хранятся в списке. Вот строка, в которой создается подпрограмма и ссылка на нее добавляется к списку:




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