sub rec(&) {
 my $f = shift;
 sub {$f->(rec($f), @_)}
}
(rec {
 my ($f, $n) = @_;
 ($n <= 2)? 1: $f->($n-1) + $f->($n-2);
})->(20);

なんかやけにトリッキーに書いてるけど、単純にこれじゃダメ?