In the end, it turned out there was a whitespace character at the end of the string. I guess the moral of this story is - you can never be too careful about testing your input, and never assume you know what's in your data.
Thanks for all your help everyone.
Corwin
I have long advocated using s/\s+$// over chomp because I consider anything where trailing whitespace matters to simply be broken (it also is useful in that it prevents a stray "\r\n" line ending from being a problem).