Another option would be to learn a different language that tends to force you to think in different ways. I've mostly used Perl in procedural ways, because that was my background from assembly and BASIC and C, so lately I've been dabbling with Lisp/Scheme, to get more comfortable with functional programming and concepts like closures and first-class functions. You can do functional programming in Perl, and some recent books like Higher Order Perl get into that; but a language like Lisp practically demands it, and tutorials include it as par for the course. Getting out of my comfort zone helps me to stop thinking, "Yeah, but why not just do it the way I've always done it?" and immerse myself in this different way of solving problems. Then I can come back to Perl and apply what I've learned.