use warnings; use strict; BEGIN { # closure: data in scope only to create_f() function my $common = 'fooble'; sub create_f { my ($user_source, # required: string: user source code ) = @_; my $private = 'xpto'; # ??? makes $common variable defined in eval ??? # any of these statements do the trick. # except as noted, tested in both 5.6.1 and 5.8.2 # print "in create_f(): common: $common \n"; # $common .= ''; map defined, $common; # note: not tested with 5.6.1 my $coderef = eval qq{ sub { $user_source } }; return $coderef; # code reference undefined if eval failed } } # end closure: create_f() function # NOTE: single quotes on here-doc tag below: no interpolation. my $function = create_f(<<'USER_CODE'); my $param = shift; print "param: $param common: $common private: $private \n"; return join ';', $param, $common, $private; USER_CODE my $freturn = $function->('hi there'); print "function return: `$freturn' \n"; #### >perl t_create_f_PM.pl param: hi there common: fooble private: xpto function return: `hi there;fooble;xpto' #### >perl t_create_f_PM.pl Use of uninitialized value in concatenation (.) or string at (eval 1) line 2. param: hi there common: private: xpto Use of uninitialized value in join or string at (eval 1) line 3. function return: `hi there;;xpto'