Perl与Bot :: BasicBot的比较(测试平等)

时间:2011-10-21 04:54:17

标签: perl comparison bots

我已经发现它似乎是我单独测试每个密钥,这就是为什么它一直说我不在运营商列表中。

技巧是将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 个答案:

答案 0 :(得分:1)

在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条件非常简单。