Recently, I was bitten by a subtle bug. I had a script that I needed to return a value from to indicate success or failure. Simply enough, where I wanted to fail, I used "exit 1". The problem was that my script always returned success. After alot of frustration, it finally hit me what the problem was...
sub END {
system("./dosomething");
}
exit 1;
exit() will set $? to the supplied value then eventually terminate with that value, but not until it executes the code in the END block. If anything in there sets $? (as system does), it will overwrite the value set by exit. The solution is to make $? local in the END block.
sub END {
local $?;
system("./dosomething");
}
-- O thievish Night, Why should'st thou, but for some felonious end, In thy dark lantern thus close up the stars? --Milton