in reply to Changing $@ in debug mode

Take a look at the debugger source code - specifically, bring up perl5db.pl in your editor and search for "Begin lexical danger zone".

This is DB::eval(), the subroutine that the debugger uses to protect itself from you. Anything that you run here can see all of the lexical variables that are currently in scope - and it saves and restores $@ so it can show it to you should the eval of the code you type in sets it. This means that manipulating $@ in the debugger won't work.

DB::eval is also the reason that my $x = "foo" "doesn't work" under the debugger - the creation of the lexical variable happens inside DB::eval, so it comes into existence and disappears again as soon as DB::eval exits.