in reply to Create reference to sorted anonymous array

Another suggestion for you in addition to that from choroba .

C style for() loops are actually quite rare in Perl. They are prone to the dreaded and most common programming error, the "off by one error". Here is another way to write blubb().

use strict; use warnings; sub blubb { my $array_ref = shift; my $i =0; foreach (@$array_ref) #dereferences the ref to an array { print $i++, " $_\n"; } } my @array = (1, 2, 3); blubb([reverse @array]); __END__ Prints: 0 3 1 2 2 1

Replies are listed 'Best First'.
Re^2: Create reference to sorted anonymous array
by Digioso (Sexton) on Mar 17, 2016 at 13:42 UTC
    Thanks for the tip. :)
    For me the C-Syntax has stuck somehow. The C-Loop provides a more readable syntax in my opinion and I'm trying to avoid using $_ as much as possible because someone else besides me might have to read my code. And when I learned programming my teachers told me to use variable names that state what they're used for. Although my school days are long gone I'm still sticking to that.
    OK, in my example @array and sub blubb are no such names obviously. :P
    Even this works btw:
    foreach (@$array_ref) { print; }
      If all you need is names, add them:
      for my $element (@array) { print $element, "\n"; }

      And, for completeness, iterating over indices:

      for my $index (0 .. $#array) { print "$index: $array[$index]\n"; }
      ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,

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

        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. :)
      As choroba and others have mentioned, I actually seldom use $_ and give an actual name to the var. This doesn't slow the code down a bit and makes it more readable.

      foreach my $line (@$array_ref) { print $line; }
      is just fine !!

      I write and lot of C code (and also ASM). I can tell you that the very, very most common error in programming is the "off by one" error. The  foreach() syntax avoids that possibility. There are a lot of programs out there that sometimes break in mysterious ways due to memory allocation errors and other issues related to the "off by one" problem. the foreach() syntax avoids this problem.

      You early instruction will serve you well. There is just a different way to do it in Perl than in C.