Polygen irssi IRC bot

Today I reworked my IRC setup and found out about irssi scripts.

I HAD to write this one:

# Polygen
#
# Runs polygen when asked
#
# usage
#
# Anyone in the same channel as the one who runs this script may ask me:
# !polygen <grammar>
# And I'll automatically reply with the proper output.
#
# Script features include help, and avoiding flood if polygen generates too
# much output.
#
# Based on the /usr/share/irssi/scripts/8-ball.pl script written by Patrik
# Jansson.
#
use strict;
use vars qw($VERSION %IRSSI);

use Irssi qw(command_bind signal_add);
use IO::File;
$VERSION = '0.20';
%IRSSI = (
    author      => 'Enrico Zini',
    contact     => 'enrico@enricozini.org',
    name        => 'polygen',
    description => 'Runs polygen for you',
    license     => 'GPL',
);

sub run_polygen ($)
{
    my ($arg) = @_;
    my $res = `polygen $arg 2>/dev/null | fmt`;
    chomp $res;
    return "Sorry, I could not find the grammar $arg (you can see a list in the polygen-data(6) manpage)." if $res eq '';
    my @lines = split("\n", $res);
    return join(" ", @lines[0..2])." [...]" if @lines > 3;
    return $res;
}

sub own_question {
    my ($server, $msg, $target) = @_;
    question($server, $msg, "", $target);
}

sub public_question {
    my ($server, $msg, $nick, $address, $target) = @_;
    question($server, $msg, $nick.": ", $target);
}
sub question($server, $msg, $nick, $target) {
    my ($server, $msg, $nick, $target) = @_;
    $_ = $msg;
    s/^enrico_*:\s*//;
    if (!/^!poly/i) { return 0; }

    if (/^!poly\w+\s+(\w+)\s*$/i) {
        my $answer = run_polygen($1);
        $server->command('msg '.$target.' '.$nick.$answer);
        return 0;
    } elsif (/^!poly\w+\s*version$/i){
        $server->command('msg '.$target.' My version is: '.$VERSION);
        return 0;
    } else {
        my $answer = "What ".run_polygen('polygen')." grammar do you want? (you can see a list in the polygen-data(6) manpage)";
        $server->command('msg '.$target.' '.$nick.$answer);
        return 0;
    }

}

signal_add("message public", "public_question");
signal_add("message own_public", "own_question");