Re: local $@ has an unwanted side effect
David Nicol [Fri, 21 Mar 2008 12:56:12 +0000 (07:56 -0500)]
From: "David Nicol" <davidnicol@gmail.com>
Message-ID: <934f64a20803211056q5148027ava77af36f51c96418@mail.gmail.com>

(with Tim Bunce's amendments)

p4raw-id: //depot/perl@33558

pod/perlfunc.pod

index e0b8049..886aae9 100644 (file)
@@ -1625,6 +1625,22 @@ normally you I<would> like to use double quotes, except that in this
 particular situation, you can just use symbolic references instead, as
 in case 6.
 
+The assignment to C<$@> occurs before restoration of localised variables,
+which means a temporary is required if you want to mask some but not all
+errors:
+
+    # alter $@ on nefarious repugnancy only
+    {
+       my $e;
+       {
+          local $@; # protect existing $@
+          eval { test_repugnancy() };
+          # $@ =~ /nefarious/ and die $@; # DOES NOT WORK
+          $@ =~ /nefarious/ and $e = $@;
+       }
+       die $e if defined $e
+    }
+
 C<eval BLOCK> does I<not> count as a loop, so the loop control statements
 C<next>, C<last>, or C<redo> cannot be used to leave or restart the block.