sub foo { no warning 'redefine'; # needed if the recursive sub calls any other sub local *_ = sub { ... ; ... _(...) ...; ... ; }; return _(@_); }