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

Further to choroba's reply: For even more complete completeness, if you're dealing with array references:

for my $element (@$arrayref) { print $element, "\n"; } for my $i (0 .. $#$arrayref) { print "$i: $arrayref->[$i]\n"; }

Update: Digioso: I quite agree with your preference for using explicitly named variables rather than default names (or none at all) in the interests of readability and maintainability. I disagree that the C-style for-loop serves these interests, quite apart from the lurking demon Offbyone.


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

Replies are listed 'Best First'.
Re^4: Create reference to sorted anonymous array
by Digioso (Sexton) on Mar 18, 2016 at 09:40 UTC
    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. :)

      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