#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my $EPSILON = 1e-7; my $f = sub { my $x = shift; return $x ** 2 - 2 * $x + 7; }; my $d = sub { my ($f, $x) = @_; my $d_ = sub { my $x = shift; return sprintf "%.3f", ($f->($x+$EPSILON) - $f->($x-$EPSILON))/( 2 * $EPSILON ); }; return defined $x ? $d_->($x) : $d_; }; print Dumper [ map $f->($_), 0..9 ]; print Dumper [ map $d->($f, $_), 0..9 ]; my $d_of_f = $d->($f); print Dumper [ map $d_of_f->($_), 0..9 ];