use warnings; use strict; use Scalar::Util qw/set_prototype/; sub foo ($$$) { print "foo(@_)\n" } foo(1,2,3); # prints "foo(1 2 3)" { my $name = "foo"; my $sub = sub { print "bar(@_)\n" }; set_prototype(\&$sub,prototype($name)); #use Devel::Peek; Dump($sub); no strict 'refs'; no warnings 'redefine'; *$name = $sub; } foo(4,5,6); # prints "bar(4 5 6)"