use warnings; sub RO { warn "RO" } sub SHAM { warn "SHAM" } RO(); { local *RO = sub { warn "BO" }; RO(); } SHAM(); { local *SHAM; *SHAM = sub { warn "BO" }; SHAM(); } RO(); SHAM(); __END__ RO at - line 2. Subroutine main::RO redefined at - line 5. BO at - line 5. SHAM at - line 3. BO at - line 7. RO at - line 2. SHAM at - line 3. #### Subroutine %s redefined (W redefine) You redefined a subroutine. To suppress this warning, say { no warnings 'redefine'; eval "sub name { ... }"; } #### $ perl -le " use warnings; sub foo { warn 1 } foo(); local *foo; sub foo { warn 2 } foo(); " Subroutine foo redefined at -e line 1. 2 at -e line 1. Undefined subroutine &main::foo called at -e line 1. #### $ perl -le " use warnings; sub foo { warn 1 } foo(); local *foo; eval q{sub foo { warn 2 }}; foo(); " 1 at -e line 1. 2 at (eval 5) line 1. #### $ perl -le " use warnings; sub foo { warn 1 } foo(); { local *foo; eval q{sub foo { warn 2 }}; foo(); } foo(); " 1 at -e line 1. 2 at (eval 5) line 1. 1 at -e line 1.