use Hook::LexWrap; sub fibonacci { my ($n) = @_; return 1 if $n < 3; return fibonacci($n-1) + fibonacci($n-2); } MEMOIZE: { my %cache; wrap fibonacci, pre => sub { $_[-1] = $cache{$_[0]} if $cache{$_[0]} }, post => sub { $cache{$_[0]} = $_[-1] }; } while (<>) { chomp; print fibonacci($_), "\n"; }