I concur that Higher Order Perl
is a great resource and that learning to program in a suitably different language like Haskell can also be very useful.
I've found a nice little book that works through lots of Computer Science/Discrete Math stuff while introducing Haskell. It's The Haskell Road to Logic, Maths and Programming by Doets and van Eijk. A very nice little intro to functional programming and haskell, and a very nice companion to HOP, IMHO. Sort of kills two birds with one stone (intro to discrete math, functional programming, and another programming language)... wait that's three birds... oh well!