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

Well, many things may bring the same results. :) The C-Style Loop also allows to do something like this:
for($i = $#sizes; $i >= 0 ; --$i) { print $sizes[$i]; }
I haven't tested it yet whether this also works:
for my $i ($#$arrayref .. 0)

And you can also do this:
for(my $i = 0; $i <= #$arrayref; $i+=2) { print "$i: $arrayref->[$i]\n"; }
Yes, you could do instead:
for my $i (0 .. $#$arrayref) { print "$i: $arrayref->[$i]\n"; $i++; }
But here you have to be aware that $i is incremented by 1 by the loop itself and then again by 1 through $i++. Makes it a bit more difficult to read imho.
I guess in the end it's what you prefer. :)

Replies are listed 'Best First'.
Re^5: Create reference to sorted anonymous array
by AnomalousMonk (Archbishop) on Mar 18, 2016 at 12:08 UTC

    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:  <%-{-{-{-<

      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.