in reply to Re^4: Create reference to sorted anonymous array
in thread Create reference to sorted anonymous array

for my $i ($#$arrayref .. 0) { ... } does not work (initial value of a range must be <= than its terminal value) but

c:\@Work\Perl\monks>perl -wMstrict -le "my $arrayref = [ qw(uno dos tres quatro cinco) ]; ;; for my $i (reverse 0 .. $#$arrayref) { print qq{$i: $arrayref->[$i]}; } " 4: cinco 3: quatro 2: tres 1: dos 0: uno
does and is more readable (again, IMHO).

Having a strange step might be handled by something like

c:\@Work\Perl\monks>perl -wMstrict -le "my $arrayref = [ qw(uno dos tres quatro cinco) ]; ;; for my $i (grep { $_ % 2 == 0 } 0 .. $#$arrayref) { print qq{$i: $arrayref->[$i]}; } " 0: uno 2: tres 4: cinco
which I would tend to favor. The only problem with this kind of loop range expression is that the complete  0 .. $#$arrayref range is built as an intermediate list, so if you're dealing with a large range of any kind you may chew up a lot of memory. The Perl compiler knows enough to optimize a  for my $n (0 .. MAX) { ... } loop to the equivalent C-style for-loop, so no potentially huge list is ever generated; it can't do that trick for  for my $n (grep { whatever } 0 .. MAX) { ... } or similar blocks.

(Another interesting candidate for this sort of thing might be List::MoreUtils::indexes or one of its cousins; also see List::Util.)


Give a man a fish:  <%-{-{-{-<

Replies are listed 'Best First'.
Re^6: Create reference to sorted anonymous array
by Digioso (Sexton) on Mar 18, 2016 at 12:30 UTC
    Eww... Seeing that ensures me to stick with the C-Style loop. :P
    Honestly using grep to determine whether to print out the next element or not is... wow. :P

      After you've been doing Perl for awhile you'll probably never want to see the C-for loop again. Perl style and idioms might be a little jarring at first but they are very readable once you get used to them and, I argue, lead toward more compact code in the loops which, for me, is easier to follow and debug. I'd rather see 5 lines of good/common idiom than 20 lines of plodding obviousness.... The more dense one is actually easier to focus on and not miss things, for me, anyway.