Actually,
POE should work just great as a telnet client.
Here's an example of a simple "port scanner" that shows how easy it is to make a TCP client with
POE::Component::Client::TCP. There are a lot more useful examples at the
POE Cookbook. Also, since POE is event based it will do exactly what you were wanting as far as passing the messages to whatever subroutine you want via callback.
It may take a little while to get used to writing programs with POE, but I highly recommend it! It is much simpler than threads and you don't have to worry about IPC like you would with forking because it's all the same process.