#!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"; }