Если ты устремился к этому тексту, то видимо уже не один раз надругался над своим сервантом самопальными скриптами и возникло желание усилить знания... Возможно это правильное решение, по сему начнём.
Узнать IP адрес вызвавшего скрипт:
| 
$User_IP=$ENV{'REMOTE_ADDR'};chomp ($User_IP);
 unless ($User_IP){$User_IP='unknown';}
 
 | 
Переменная $User_IP будет содержать IP адрес.
Создать полный путь до скрипта (нужно для вставки пути в формы):
| 
$ScrHost=$ENV{'HTTP_HOST'};$ScrName=$ENV{'SCRIPT_NAME'};
 ($ScrName, $ScrName1) = split(/\?/, $ScrName);
 $ScrFullPath="$ScrHost$ScrName";
 $ScrFullPatha=substr($ScrFullPath, 0, 7);
 $ScrFullPatha=~tr/a-z/A-Z/;
 if ($ScrFullPatha ne 'HTTP://'){$ScrFullPath="http://$ScrFullPath";}
 
 | 
Переменная $ScrFullPath будет содержать полный путь к скрипту.
Имя браузера юзера:
| 
$User_BrName=$ENV{'HTTP_USER_AGENT'};chomp ($User_BrName);
 unless ($User_BrName){$User_BrName='unknown';}
 
 | 
Переменная $User_BrName будет содержать имя браузера вида "Mozilla/4.51 ...".
Узнаём откуда перешли на наш скрипт:
| 
$User_Reff=$ENV{'HTTP_REFERER'};chomp ($User_Reff);
 unless ($User_Reff){$User_Reff='unknown';}
 $User_Reff =~ tr/+/ /;
 $User_Reff =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 
 | 
Переменная $User_Reff будет содержать путь вида "http://server.ru/docum.htm...", причём
Unicode если имело место будет раскодировано.
Редиректить пользователя скриптом:
| 
$URL_for_redirect='http://deface.ru/';
 print "Location: $URL_for_redirect\n\n";
 | 
Вывести наш документ как HTML:
| 
$Document='Мой html для вывода в браузер';
 print "Content-Type: text/html\n\n";
 print "$Document";
 | 
Вывести наш документ как обычный текст:
| 
$Document='Мой текст для вывода в браузер';
 print "Content-Type: text/plain\n\n";
 print "$Document";
 
 | 
Отправить сообшение на e-mail:
| 
$Mail_PRG="/usr/sbin/sendmail -t";$Message_mail='Текст который будет в теле письма';
 $Subject_mail='Текст в поле Subject письма';
 $Mail_adr_FROM='my_mail@mail.ru';
 $Mail_adr_TO='you_mail@mail.ru';
 
 open(dAtA, "|$Mail_PRG") or die "Error Send mail message";
 print dAtA "To: $Mail_adr_TO\n";
 print dAtA "From: $Mail_adr_FROM\n";
 print dAtA "Subject: $Subject_mail\n\n";
 print dAtA "$Message_mail\n\n.\n";
 close (dAtA);
 
 | 
Прочитать из файла и выдать GIF картинку:
| 
Filename_gifack='filename.gif';
 print "Content-Type: image/gif\n\n";
 open yo_potokG,$Filename_gifack;
 print <yo_potokG>;
 close yo_potokG;
 
 | 
Прочитать из стандартного потока данные передаваемые пользователем:
| 
read(STDIN, $bufferoks, $ENV{'CONTENT_LENGTH'});@mazzive = split(/&/, $bufferoks);
 foreach $elemenzz (@mazzive) {
 ($argumm, $value) = split(/=/, $elemenzz);
 $value =~ tr/+/ /;
 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 $inpdatz{$argumm} = $value;
 }
 $Mail_address=$inpdatz{'email'};
 
 | 
Переменная $Mail_address в данном случае будет содержать данные из поля с именем "email",
формы вызвавшей скрипт.
Очищаем текст от тегов и заменяем перенс строки на код <Br>:
| 
$Input_text='<b>Это текст</b>, для проверки.';
 $Input_text=~s/\x0D//g; # Убиваем часть Win кода переноса строк (x0dx0a)
 $Input_text=~s/</</g; # Теговые скобки меняем на их html код
 $Input_text=~s/>/>/g; # Теговые скобки меняем на их html код
 $Input_text=~s/\x0A/<Br>/g; # Заменяем Unix код переноса строк на BR
 $Input_text=~tr/\x00-\x1F/ /;
 
 | 
Естественно что если прогнать текст дважды через замену, то появившееся после первой
замены BR`ки будут расценены как нежелательные теги...
Реализуем некое подобие SII:
| 
$File_html='filename.html';$My_text='Текст который заменит в html конструкцию <!--KEYWORD-->';
 
 open (TempDat, "$File_html") or die "Error open output doc";
 $Temp_doc = join ('', <TempDat>);
 close (TempDat);
 $Temp_doc =~s#<!--KEYWORD-->#$My_text#sg;
 print "Content-Type: text/html\n\n";
 print "$Temp_doc";
 
 | 
Можно и в переменную $My_text загрузить другую html`ку, тем самым собрать документ
вывода по кускам.
Запретить работать со скриптом пользователям с установленным IP (в том числе и с учётом
маски, например 127.*.0.1, где * означает все адреса):
| 
@Denied_IP=("127.0.0.1", "210.0.*.2", "211.0.0.*");
 $Flag_Access=1;
 $User_IP=$ENV{'REMOTE_ADDR'};
 chomp ($User_IP);
 unless ($User_IP){$Flag_Access=0;}
 ($nIP1,$nIP2,$nIP3,$nIP4) = split(/\./, $User_IP);
 $nIP0=$nIP1+1;
 $nIP0s=$nIP0;
 if ($nIP0 < 1 || $nIP0 > 256){$Flag_Access=0;}
 $nIP0=$nIP2+1;
 $nIP0s=$nIP0s + $nIP0;
 if ($nIP0 < 1 || $nIP0 > 256){$Flag_Access=0;}
 $nIP0=$nIP3+1;
 $nIP0s=$nIP0s + $nIP0;
 if ($nIP0 < 1 || $nIP0 > 256){$Flag_Access=0;}
 $nIP0=$nIP4+1;
 $nIP0s=$nIP0s + $nIP0;
 if ($nIP0 < 1 || $nIP0 > 256){$Flag_Access=0;}
 if ($nIP0s < 5){$Flag_Access=0;}
 for ($n=0; ($Denied_IP[$n] ne '' && $Flag_Access == 1); $n++){
 $ndIP0=$Denied_IP[$n]; chomp ($ndIP0);
 ($ndIP1,$ndIP2,$ndIP3,$ndIP4) = split(/\./, $ndIP0);
 if ($nIP1 eq '*'){$ndIP1=$nIP1;}
 if ($nIP2 eq '*'){$ndIP2=$nIP2;}
 if ($nIP3 eq '*'){$ndIP3=$nIP3;}
 if ($nIP4 eq '*'){$ndIP4=$nIP4;}
 if ($ndIP1 eq $nIP1 && $ndIP2 eq $nIP2 && $ndIP3 eq $nIP3 && $ndIP4 eq $nIP4){$Flag_Access=0;}
 }
 if ($Flag_Access == 1){Доступ разрешаем}else{Доступ закрыт}
 
 | 
Этот алгоритм не обрабатывает строки не_анонимных прокси серверов, его принцип,
всему что непохоже на IP прикрывать досуп.
Проверка правильности E-mail адреса (довольно простая):
| 
$Input_Email='mymail@mail.ru';
 $Flag_Access=1;
 $In_ln=split(//, $Input_Email);
 if ($In_ln < 4){$Flag_Access=0;}
 $In_ln=split(/\@/, $Input_Email);
 if ($In_ln < 2){$Flag_Access=0;}
 $In_ln=split(/\./, $Input_Email);
 if ($In_ln < 2){$Flag_Access=0;}
 $In_pr=$Input_Email;
 $In_pr=~tr/*=^%&()[],?\\<>'"| ЙЦУКЕНГШЩЗХФЫВАПРОЛДЖЯЧСМИТЬБйцукенгшщзхфывапролджэячсмитьбю/!/;
 $In_prn=index($In_pr, '!');
 unless ($In_prn == -1){$Flag_Access=0;}
 if ($Flag_Access == 1){Адрес верный}else{Адрес некорректен}
 
 | 
Проверка правильности URL адреса (довольно простая):
| 
$Input_URL='mymail@mail.ru';$Flag_Access=1;
 $In_ln=split(//, $Input_URL);
 if ($In_ln < 12){$Flag_Access=0;}
 $In_ln=split(/:/, $Input_URL);
 if ($In_ln < 2){$Flag_Access=0;}
 $In_ln=split(/\./, $Input_URL);
 if ($In_ln < 2){$Flag_Access=0;}
 $In_pr=$Input_URL;
 $In_pr=~tr/*=^()?&[],\\<>'"| ЙЦУКЕНГШЩЗХФЫВАПРОЛДЖЯЧСМИТЬБйцукенгшщзхфывапролджэячсмитьбю/Й/;
 $In_prn=index($In_pr, 'Й');
 unless ($In_prn == -1){$Flag_Access=0;}
 
 | 
	
Позволю себе сказать несколько слов на почти отвлечённую тему. Частенько я слышу, что программируя надо применять разнообразные модули, библиотеки, писать скрипты на программах - конструкторах... В тоже время я созерцаю как книги Д. Кнута растут в цене. Складывается прямо таки неприятная картина, будто программеров решили отучить думать, заставить их мозг повиноваться документации по модулям, прикрываясь вопросом: "Зачем дважды изобретать велосипед?".
Кратко говоря, все эти модули, библиотеки... От лукавого это!
Учитесь думать, а не программить как дядя приказал, возможно вы где-то и убьете немного больше времени, но по крайней мере станет приятно читать ваши исходники, именно ВАШИ, а не тупые вызовы модулей написанных яйцеголовыми дяденьками с монотонной серостью жизни и мысли, да и мысль ваша станет более чёткой и быстрой равно как и программы ;-)
С уважением, трогал пластик кнопок, 90hex.