In C one of the most common errors to make is an off-by-one
error. If you use explicit for loops in Perl, you will
make the same error just as often. This is a good reason
to use foreach loops whenever possible.
I mention this because your second observation has an
off-by-one in it. The odds of an off-by-one can be
reduced, though, by:
foreach my $i (0..$#filenames) {
# ...
}
since that removes an inequality that people may miswrite.
An even cleaner solution is offered by
tye at
mapcar -- map for more than one list.