Итак, предположим, что вы пишете гостевую на perl и столкнулись с такой проблемой: гостевая готова, все работает, но чего-то не хватает, а именно - гостевая слишком проста. Вам хочется сделать её более "навороченной". Что ж, попробую показать вам, как можно легко, используя стандартные средства perl, сделать вашу гостевую лучше.
• Часть первая. Избавляемся от мата.
Вам надоело, что всякие уроды матерятся у вас в гостевой? Сейчас я покажу, как очень легко можно сделать защиту от мата.
Для начала, создайте какой-нибудь текстовой файл, например, bad_words.dat, в котором пропишите корни всех матов - не сами маты, а именно их корни. Если вы не знаете, как найти корень слова, сходите в ближайшую среднюю школу, найдите там учителя русского языка и попросите объяснить.
Ладно, предположим, что корни слов-матов вы смогли выделить и записали их в текстовик построчно. Теперь небольшой кусочек кода, который заменит подобные корни будет заменять в словах, например, на "[цензура]".
Для начала, откроем созданный нами текстовик и загоним все его строки в один массив, например в @bad_w:
open BADW, "bad_words.dat";
@bad_w = ;
close BADW;
Затем, используя цикл foreach и оператор подстановки s///, легко и просто заменим все маты:
foreach $bad_w (@bad_w){
$bad_w=~ s/\r|\n//g;
$msg=~ s/$bad_w/[цензура]/g; #замена матов в сообщении
$nick=~ s/$bad_w/[цензура]/g; #замена матов в нике
}
Получается, что переменная $bad_w - это каждая строка из массива @bad_w, то есть корень слова-мата, везде, так как используется глобальный модификатор шаблона /g, заменяется на "[цензура]". Вот, в принципе, и всё с этим.
•Часть вторая. Вешаем баны.
Итак, маты мы убрали. Но существуют такие люди, которые любят пофлудить, пооффтопить и позаниматься прочей гадостью. Заменять такую гадость вышеизложенным способом, естественно, нерационально. Проще закрыть доступ к гостевой таким людям. Нет, пусть они читают сообщения и кусают локти, а сообщения они добавлять не смогут. Сейчас я покажу, как это сделать.
Для начала, узнаем IP-адрем заходящего в вашу гостевую книгу. В этом нам поможет стандартная переменная окружения в perl:
$ip = $ENV{'REMOTE_ADDR'};
Затем, нам опять же надо создать текстовой файл, например, bans.dat, в котором построчно прописать те IP-адреса, добавления сообщений с которых нежелательно.
Создав подобный файл, перенесем все IP-адреса, прописанные там в массив, например, в @bans:
open BANS, "$bans";
@bans = ;
close BANS;
Теперь будем сравнивать каждый IP-шник из файла с переменной $ip, используя циклы foreach и if и если забаненный IP будет равен текущему IP, присвоим какой-нибудь переменной, например $ok, какое значение, например "BAD":
foreach $ban (@bans){
$ban=~ s/\r|\n//g;
if ($ip eq $ban){
$ok = "BAD";
print "";
}
}
И теперь, при добавлении этого сообщения, если переменная $ok будет равна "BAD", это сообщение добавляться не будет. Для этого, в условиях добавления сообщения, напишите примерно так:
if ($ok ne "BAD"){#добавляем сообщение}
•Часть третья. Защита от флуда на F5.
Теперь мы защитимся от флуда на обновление страницы. Хоть и можно добавить адрес флудера в список банов, очищать гостевую от флуда не всегда приятно, так ведь?
Итак, сделаем так: при нажатии F5 (либо же кнопочки "обновить") после добавлении сообщения, это сообщение добавляется ещё раз, что, конечно же, нежелательно. Поэтому мы каждое новое сообщение при добавлении будем сравнивать с предыдущим, и, если оно будет равно ему, так же, как и во второй части, присвоим переменной $ok параметр "BAD". А что дальше делать с этой $ok я уже показал.Итак, приступим. Откроем файл, в котором хранятся сообщения гостевой и из последней строки, используя стандартную функцию языка split, вычислим последнее сообщение:
open FILE, "$file";
@abc = ;
close FILE;
($nick_last, $ip_last, $msg_last)= split(/;;;;;/, $abc[@abc-1]);
$msg_last=~ s/\r|\n//g;
Как вы уже, наверное догадались, все сообщения мы загрузили в массив @abc, потом из последней строки, $abc[@abc - 1], зная, что разделитель у нас между ником, IP-адресом и сообщением, узнали последнее сообщение - $msg_last. Теперь, используя цикл if, сравним последнее сообщение с добавляемым, и, если результат сравнения положителен, присвоим $ok значение "BAD":
if ($msg_last eq $msg){$ok="BAD";}
Дальше вы уже знаете, что делать, по примеру из второй части.
•Эпилог. Выводы и всё такое...
Надеюсь, вы убедились в том, что используя стандартные средства замечательного языка программирования perl, можно гораздо улучшить свою гостевую книгу и моя статья вам в этом помогла.Напоследок, хочу привести вам ещё несколько примеров, которые более мелкие и менее важные, чем предыдущие.
Предположим, что отписавшийся в гостевухе человек, забыл написать свой ник. Что ж, не беда, сделаем ему ник такой, какой удобен нам:
if ($nick eq ""){$nick = "Аноним";}
То есть, если параметр $nick пуст, присваиваем ему значение "Аноним".
Также можно сделать ограничение на количество вводимых символов в сообщении, чтобы слишком много не писали вам, используя функцию substr:
$msg= substr($msg, 0, 1024);
Теперь размер сообщения будет не больше килобайта, а то, что больше - будет обрезаться.И таких примеров может быть очень много, о всех в одной статье не расскажешь. Эта статья - лишь попытка доказать, что Perl - очень мощный и гибкий язык программирования, с помощью которого можно творить очень хорошие вещи. Попробуйте сами - это интересно, это затягивает.