For knowing when a command is entered, you could employ the services of
Term::ReadLine - that should give you not only notification of a command's entry, but also such wellcome features as command line editing and history.
As for combining it with an object, you should first define the commands and the grammar you would accept, then perhaps parse the commands with something akin to Parse::RecDescent - or something simpler if your grammar is simple enough.
Personaly, for an adventure of any sophistication, I don't think hashes are going to be sophisticated enough - to simulate actions on objects you should use, well, objects...