#!/usr/bin/perl use strict; use warnings; sub make_stepper { my $step = shift; my $i ; my $stepper = sub { my $usr_int = shift; my $j ; $i++; $j++; $usr_int *= $step; print '$i: ' , $i , "\t", '$j: ' , $j , "\t", '$usr_int: ' , $usr_int , "\t", "\n" ; }; return $stepper; }; print "Double: \n"; my $double = make_stepper( 2 ); &$double( 13 ); &$double( 22 ); print "\n"; print "Triple: \n"; my $triple = make_stepper( 3 ); &$triple( 13 ); print "\n"; print "Quadle: \n"; my $quadle = make_stepper( 4, 99 ); &$quadle( 13 ); &$quadle( 22 ); &$quadle( ); print "\n"; print "Reprise: \n"; &$double( 5 ); &$triple( 5 ); &$quadle( 5 ); __DATA__ Output: Double: $i: 1 $j: 1 $usr_int: 26 $i: 2 $j: 1 $usr_int: 44 Triple: $i: 1 $j: 1 $usr_int: 39 Quadle: $i: 1 $j: 1 $usr_int: 52 $i: 2 $j: 1 $usr_int: 88 Use of uninitialized value $usr_int in multiplication (*) at ./closure-demo.pl line 18. $i: 3 $j: 1 $usr_int: 0 Reprise: $i: 3 $j: 1 $usr_int: 10 $i: 2 $j: 1 $usr_int: 15 $i: 4 $j: 1 $usr_int: 20 __END__