use strict; use warnings; sub stringmaker { my( $start, $stringref ) = @_; return sub { $start.$$stringref } } my $r = 300; my $g = stringmaker( 'g', \$r ); print $g->()."\n"; #would be 'g300', that's ok $r = 500; print $g->()."\n"; #would be 'g500' #### use strict; use warnings; sub stringmaker { my( $template, @vals ) = @_; return sub { sprintf $template, map { $$_ } @vals } } my $r = 300; my $i = 0; my $g = stringmaker( '%s: g%s', \$i, \$r ); print $g->()."\n"; # '0: g300' $r = 500; $i = 10; print $g->()."\n"; # '10: g500'