I recommend cutting out all the extra code next time, it is very distracting from the actual problem.
So here is the code that you say appears to be bad
#-------------------Watch for IRC Inputs-------------------
sub incoming_data {
my ( $fd, $condition, $fh ) = @_;
print "its going\n";
if ( $condition eq 'in' ) {
my $input;
sysread $fh, $input, 1000000;
#chop $input;
$input =~ s/\r\n//g;
my $hashref = $parser->parse( $input );
SWITCH: {
my $type = lc $hashref->{command};
my @args;
push @args, $hashref->{prefix} if $hashref->{prefix};
push @args, @{ $hashref->{params} };
if ( defined $dispatch{$type} ) {
$dispatch{$type}->(@args);
last SWITCH;
}
print STDOUT join( ' ', "irc_$type:", @args ), "\n";
}
}
return 1;
}
First, I recommend changing:
sysread $fh, $input, 1000000;
#chop $input;
$input =~ s/\r\n//g;
to:
$input = <$fh>;
chomp $input;
You can put a loop in there if you want to handle more than one line at a time. What you are doing mushes everything together and makes it unparseable.