#!perl use strict; use warnings; sub lambda { my $varname = shift; my $fn_body = shift; my $estring= "sub { my \$$varname = shift; $fn_body }"; print "Evaling $estring\n"; eval $estring; } my $x = 3; my $closure = lambda 'x' => q { $x**2 }; for (1..4) { print $closure->($_), "\n"; } print "And my X is $x\n"; #### #!perl use strict; use warnings; sub lambda { my $varname = shift; my $fn = shift; my $pkg = do { no strict 'refs'; * {caller().'::'} }; sub { local ${$pkg}{$varname} = \shift; $fn->() } } package a::b::c; our $x; my $closure = main::lambda 'x' => sub { $x**2 }; for (1..4) { print $closure->($_), "\n"; }