Сравнение Perl с Bot :: BasicBot (тестирование на равенство) - PullRequest
0 голосов
/ 21 октября 2011

Я понял, что, похоже, я тестировал каждый ключ по отдельности, и поэтому он продолжал говорить, что меня нет в списке операторов.

Хитрость заключалась в том, чтобы вывести оператор else из foreach ичтобы изменить его на оператор if.

тогда довольно неприятный хак внутри теста для не равных

оригинал:

if($config->{'OP'}[$key] ne $message->{who})

новый:

if($config->{'OP'}[$key-1] ne $message->{who})

окончательный полный код:

#!/usr/bin/perl

use strict;
use warnings;

package kbot;
use base qw(Bot::BasicBot);
use YAML;
use Data::Dumper;


my $bot = kbot->new(
                server => 'irc.saurik.com',
                channels => ['#spam','#kbot'],
                nick => 'kbot',);


sub reload{
        system("perl kbot.pl");
}


sub said {
        my ($self, $message) = @_;
        my $config = YAML::LoadFile('kelbot.yml');
        if($message->{body} =~ 'reload'){
                reload();
        }

        if($message->{body} =~ 'opme'){
                  foreach $::key (keys $config->{OP}){
                        print $config->{OP}[$::key],"\n";
                        if($config->{OP}[$::key] eq $message->{who}){
                                $bot->mode($message->{channel}.' +o '.$message->{who});

                        } #end of if op
                  } #end of foreach
                  if($config->{OP}[$::key-1] ne $message->{who}){
                                $bot->say( channel => $message->{channel},
                                body => 'You aren\'t in the Operators list.',
                                address => $message->{who},
                                 );
                } #end of optest
        } #end of opme

} #end of said

sub chanjoin {
        my ($self, $message) = @_;
        return 'kbot now online!';
}

$bot->run();

1 Ответ

1 голос
/ 21 октября 2011

Есть гораздо лучшие способы сделать это в Perl, чем пытаться создать цикл c-esque.Из кода это выглядит так: $config->{'OP'} - это массив, но меня немного смущает, что вы одновременно используете индекс массива ([]) и keys для него.Если это массив, тогда просто используйте grep

if (grep { $_ eq $message->{who} } @{ $config->{OP} }) {
    $bot->mode("$message->{channel} +o $message->{who}");
} else {
    $bot->say(channel => $message->{channel},
              body => q{You aren't in the Operators list.},
              address => $message->{who});
}

Этот код полностью заменит ваш цикл foreach.Команда grep - это то, что проходит по всему списку и определяет, появляется ли в нем $message->{who}.Поскольку это делается так легко в одном утверждении, условие if о том, что делать в случае его появления, или нет, очень простое.

...