use strict; my $evaled = 0; # very simplified... sub makesub { my($name) = @_; return "sub $name { print \"\$var \"; }"; } sub a { my($var) = @_; if(!$evaled) { eval(makesub("somesub")); $evaled=1; } } a("what"); somesub(); a("the"); somesub();