Ok, first lets look at the function signature of (.) in Haskell:
(.) :: (b -> c) -> (a -> b) -> a -> c
This is easily implemented like this
foo :: (b -> c) -> (a -> b) -> a -> c
foo f g a = f(g a)
An implementation in Perl might look like this then
sub dot {
my $f = shift;
my $g = shift;
my $a = shift;
$f->( $g->($a) )
}
Now we implement the function negate
like this
sub negate { - shift }
And we are ready to use it like so
my @foo = map { dot \&negate, sub{abs}, $_ } -2..2;
print join( ", ", @foo) . "\n";
But as you can see from the other answers, there are easier ways to do this. So what you should really ask yourself is, why would you want to. Haskel has several characteristics which make function composition really useful. In Perl however, it feels really clunky and awkward to me.
If you are interested in what kinds of functional programming Perl is actually good at, i recommend the Book Higher-Order Perl.