Сразу уточню, что статья для начинающих. Тех, кто освоил синтаксис и познал основы языка, но кому не хватает опыта. Все-таки, решение текущих задач — лучший способ учиться!
Быть новичком в Perl довольно нелегко. Особенно сейчас, когда сообщество программистов на этом эпично-прекрасном языке только-только возвращается из небытия: пишутся статьи, выкладывается код, функционирует т.н. Планета. Ломать рамки, формирующие границы мышления тяжело, а еще тяжелее было, когда не с кем посоветоваться. После прочтения книг и ознакомления с простыми методами программирования, новичку требуется опыт. Сколько книг и статей не читай, а чтобы знать язык и уметь программировать, надо писать код: заниматься и жить этим. Это одна из моих первых маленьких работ. Совместно с товарищем, мы захотели повесить на канал бота для викторины. Модуль викторины нашелся довольно быстро, хотя сам по себе он «кривоват» и заразил своей кривизной все остальное. Он был поправлен для того, чтобы работать с русским текстом. Модуль Net::IRC считается довольно старым. Ему на смену уже давно пришли многие другие пакеты. Одним из них является событийный AnyEvent::IRC, однако, для обучения и и работы простейшего бота на достаточно на данный момент Net::IRC.
#!/usr/bin/perl # какие-то непонятные буквы (irony)
use warnings; # тоже объяснено в учебниках про предупреждения
use Net::IRC # используем класс
$irc = new Net::IRC; # собственно объект
Первый метод, который нам будет нужен, это метод newconn.
$conn = $irc->newconn(
Nick => ‘HackBot’, # Ник в сети
Server => ‘irc.r3al.ru’, # Сервер, к которому подключаемся
Port => 6667, # Порт сервера
Ircname => ‘I am bot, baby! (:’, # Имя
Timeout => 5 # Важная вещь — таймаут. Время ожидания ответа.
);
Нетрудно догадаться, что с помощью него задаются важные для соединения бота с сервером данные. В принципе, уже можно подключаться с помощью метода start(), однако, нам же нужно, чтобы бот хотя бы зашел на канал и, желательно, выполнял какие-либо функции. Когда бот соединяется с сервером, то получает от него сообщение «376», которое означает, что соединение установлено. После этого можно заходить на каналы и т.д. Чтобы бот отреагировал на это сообщение, мы воспользуемся методом add_handler().
$conn->add_handler(‘376’, \&on_connect); # вызов функции on_connect(), при успешном подключении.
Сама функция уже может выполнять нужные нам функции. Например, заход на канал:
sub on_connect {
my $self = shift;$self->join(‘#perl’); # заходим на канал #perl
$self->privmsg(‘#r3al’, «Всем привет! (:»); # Пишем сообщение на канал!
}
Обычно, боты реагируют на сообщения на канале, выполняя какие-то функции. Чтобы бот «читал» новые сообщения пользователей, используем тот же метод add_handler(), только уже с параметром public.
$conn->add_handler(‘public’, \&on_public); # Вызываем функцию on_public(), если в чате появилось новое сообщение.
Ну а функция может хитро выделять команды, которые и нужно обрабатывать. Таким образом можно немного снизить нагрузку.
sub on_public {
my ($conn, $event) = @_;
my $text = $event->{args}[0]; # То, что сказано на канале кем-то.
if ($text =~ /^\!(.+)/) { # Простая регулярка, которая отличает команды, а не текст. (Командами обычно являются слова после знака «!», стоящего в самом начале текста.)
on_public_command($conn, $1, $event->{nick}); # Ну а дальше можно обрабатывать.
}
На самом деле, можно делать еще проще. Да и бот необязательно должен выполнять какие-то команды. Как говорится, то можно сделать несколькими способами. (;
Новичку стоит научиться читать чужой код, т.к. документации на модули мало и, зачастую, она на английском.Примеры и готовый аналогичный код покажет вам логику работы модуля, либо просто укажет путь. Конечно, в наше время от этого мало практической пользы, однако, это неплохой способ начать работать с языком Perl, выполняя практические работы, а не решая какие-то задачки. В качестве более сложного примера подойдет наш старенький кривой бот викторины, который с горем пополам выполнял одноименную функцию. Так же, любителям IRC я рекомендую канал #ru.pm, который находится в сети MAGnet.
Сервер: irc.perl.org
Порт: 6667
Канал: #ru.pm
Опытные программисты часто отвечали на мои вопосы. Помогали разобраться в некоторых проблемах. Сама сеть англоязычная, а на канале общение на русском (Кодировка UTF-8). УДАЧИ!
Фокси — иди ты в андерграунд со своими темами — блог еле просматривается (как и мой), а если на норм сайте по разработке этой темы выложишься — то сметут нубы…
Как и я в литературе — сборники не печатают — сначала нужно стать известным (((
А вот и не все так грустно. Меня планета перла парсит, кажется. Точнее, ссылка есть на меня точно. Ридер видит, что меня читают. Надо практиковаться и в технических статьях. Вдруг, что пригодится. Я сам в начале такие вещи гуглом нискал, а на русском ну нихрена не было…
с этой стороны ты прав 100% бывает на очень мелком и неизвестном сайте найдёшь тока нужную инфу 1