4 hours is enough time to watch a good film and have a good meal. It’s also just enough time to find a very annoying bug.
My script wasn’t inserting all its stuff into the database, but it was inserting part of it so I knew it wasn’t a database connectivity problem; it was also reaching the end without complaint, so I knew it wasn’t dieing somewhere. It thought it was doing the right thing.
The code looked correct, and I had similar scripts that worked, so I starting cutting bits off (the code). Eventually I had two scripts, one working and one failing, with the following diffs:
-my ($username) = "marty" or exit 65; +my ($username) = ($rcpt =~ /(\w+)\@$MX/) or exit 65;
Now I knew I would be here for quite a while: someone somewhere in the code was using one of those irritating regex variables without checking if their match had actually worked! AARGH!
The offending code looked something like this (I’ve simplified it so it won’t distract from the bug):
$text =~ m/:(\w+);|==(\w+)==/; return $+;
So, when $text was "foobar", the match failed and $+ still contained the last bracketed part of a previous unrelated match.
The code should have been something like:
$text =~ m/:(\w+);|==(\w+)==/ or return; return $+;
I do try to be thankful in all circumstances: I’m glad I was using Free Software that I can debug and patch.