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



              

Распространенные ошибки при отправке почты - часть 4


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

$тах = 60*60»24;

 максимальная задержка в секундах (1 день)

$min = 60*5; tt минимальная задержка в секундах (5 минут)

$unit = 60; tt уменьшаем задержку относительно этого значения (1 минута)

$start_power = int log($max/$unit)/log(2): # ищем ближайшую степень двойки

sub time_closure {

my($last_sent,$last_power)=(0,$start_power+l); return sub {

(($last_sent, $last_p<wer) = @_) if ё>_; n keep exponent positive

$last_power = ($last_power > 0) 9

$last:_power : 0; [Siast^sent,$last_power]; } };

$last_data=&t ime_clusiire;

n создаем замыкание

 возвращаем ггче

при первом вызове и затем после роста

it экспоненты sub exprampup {

my($last_sent,$last_power) = @{&$last_data}.

 возвращаем true, если это первое обращение или если

 текущая задержка истекла с момента последнего обиащен/я.

Если сообщение отправляется, то мш запоминаем время

последнего ответа и увеличиваем

$min : $unit * 2**$last_power) <= time())){

&$last_data(time(),++$last_power1): return 1;

 }

else

{

return 0; } }

В обоих примерах вызывалась дополнительная подпрограмма (&$last_data), которая позволяла выяснить, когда было отправлено последнее сообщение и как вычислялась задержка. Позже, при необходимости изменить программу, такое деление позволит изменить способ хранения состояния. Например, если переписать программу так, чтобы она выполнялась периодически, а не постоянно, то замыкание совсем нетрудно заменить обычной подпрограммой, сохраняющей нужные данные в текстовом файле и потом считывающей их оттуда.




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