我已经发现它似乎是我单独测试每个密钥,这就是为什么它一直说我不在运营商列表中。
技巧是将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();
答案 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条件非常简单。