use strict; use warnings; my $log = parse_regex( q#(\\.|["']|x)# ); print $log; warn "And STDERR is back\n"; sub parse_regex { my ($regex) = @_; # Catch and stash warnings my $guard = stderr_eater(my $parselog); # --- compile regex eval q{ use re 'debug'; qr/$regex/; }; return $parselog; } sub stderr_eater { package STDERR::Eater; open my $guard, '>&', STDERR; close STDERR; open STDERR, ">", \$_[0]; return bless \$guard; sub DESTROY { close STDERR; open STDERR, ">&", $_[0]; } }