Рабочий perl-код с комметариями ниже. Описывать считаю бессмысленным, если ты перловик.

undefined

use WWW::Telegram::BotAPI;

my $api = WWW::Telegram::BotAPI->new(
    "token" => "mytoken",
);

$api->agent->can("inactivity_timeout");
$api->agent->inactivity_timeout (45);

my $me = $api->getMe or die;

my ($offset, $updates) = 0;

sub command_start {
    my $chat = shift;

    $api->sendMessage({
        "chat_id" => $chat->{"chat_id"},
        "text" => "Вы прислали команду /start",
    });
}

while (1) {
    $updates = $api->getUpdates({
        timeout => 30,
        $offset ? (offset => $offset) : ()
    });

    unless ($updates and ref $updates eq "HASH" and $updates->{"ok"}) {
        warn "Ошибка!!!";
        next;
    }
    for my $u (@{$updates->{"result"}}) {     
        $offset = $u->{"update_id"} + 1 if $u->{"update_id"} >= $offset;

        if (my $text = $u->{"callback_query"}{"data"}) {
            # коллбэк
            print "[callback] $text\n";

            my $chat = $u->{"callback_query"}{"message"}{"chat"};
        }

        if (my $text = $u->{"message"}{"text"}) {
            if ($text =~ m/^\/[^_]./) {
                # команда
                print "[command] $text\n";
                
                my $chat = $u->{"message"}{"chat"};

                # пример вызова нужного метода, в зависимости от прихода
                if ($text =~ /start/) {
                    command_start($chat);
                }
            }
            else {
                # текст
                print "[answer] $text\n";

                my $chat = $u->{"message"}{"chat"};
            }
        }
    }
}