Tie? That's an idea I obviously didn't have. However, when trying your code, which I am ever so grateful for, I noticed that local $_ caused the carping - which was what I was trying to avoid. Since $_ was now localised, I didn't care if it was being changed because that's kinda like a new value. Somewhere in my do_something_complex function, I'm causing a file to be loaded (only once - there's lots of caching going on). And that file load has a "while (<$fh>)" line in it to parse out the file. And so I'm getting about a bazillion carps - even after localisation.
Hopefully this helps make my original query more clear... maybe not possible, but clear :-)
Update: That all said, this file load was the problem. So my code is cleaner now because of this, although the general question is, I think, a useful question - how to determine a variable changing, discounting any localised changes. In other words, a variable whose change will propogate back up the call stack.