Here are some ideas:
1. Do not use $_ (implicitly), use named variables.
Reason : You need to keep track of where the value of $_ is created, and where it is destroyed, which is difficult. You also need to keep track of what functions use $_, and as what argument.
2. Do not use consecutive maps and/or greps on a line. Split them into several lines with temporary variables, or use foreach.
Reason: Hard to look into maps and greps with a debugger.
3. Write long variable and function names, as "jump_to_good_place_in_file()",
my $current_template_contents = $self->current_template_contents;
(OK, I write almost ridiculously long names, but it works for me :-)
4. Write methods that are no longer than one screen. If longer, make it into two methods.
5. Use objects and methods instead of subroutines. Objects give a spatial relationship between chunks of code, which is easier for the (average) mind to grasp than several subroutines called at diiferent places in a program.
6. Write a lot of comments, especially about the purpose of a code chunk.
/jeorgen