http://www.perlmonks.org?node_id=943128


in reply to push in for loop

You can accomplish whatever it is you are desiring by using array indices instead:

my @problems = (1,2,3); for my $i (0 .. $#problems) { push @problems, $problems[$i] if $problems[$i]; } print for @problems;

Care to explain what it is you are trying to accomplish? :)

jeffa

L-LL-L--L-LL-L--L-LL-L--
-R--R-RR-R--R-RR-R--R-RR
B--B--B--B--B--B--B--B--
H---H---H---H---H---H---
(the triplet paradiddle with high-hat)

Replies are listed 'Best First'.
Re^2: push in for loop
by NetWallah (Canon) on Dec 12, 2011 at 21:51 UTC
    Here is a more 'perlish' alternative to the 'c-style' loop:
    my @x=qw|0 1 2 3 4|; for my $s( @x[0..$#x] ){ # Slice = entire array $s and push @x, $s; }; print "@x\n"' #----Output--- #0 1 2 3 4 1 2 3 4

                "XML is like violence: if it doesn't solve your problem, use more."

Re^2: push in for loop
by Sewi (Friar) on Dec 12, 2011 at 17:28 UTC

    I was pretty sure that the array is being build on loopstart.

    I got a list of clustered servers and want to load balance between them, but still re-use existing connections. The servers for the current try are within an array. I went through it and pushed all servers the script is connected to onto the list again to double their chances to be selected by the following random selection. I solved the issue using map, but I always like to understand why something isn't working. If it's a known limitation, it's not my fault and (now) I know not to try it :-)

      I am glad you used map, which would be my recommendation for filtering an array. The reason the array is not being completely scanned before the for loop begins is due to memory optimization. You can always explicitly copy the array instead if needed, but it would be a code kludge to have to tell Perl not "build up the array" every time. (That's my take, anyway.)

      jeffa

      L-LL-L--L-LL-L--L-LL-L--
      -R--R-RR-R--R-RR-R--R-RR
      B--B--B--B--B--B--B--B--
      H---H---H---H---H---H---
      (the triplet paradiddle with high-hat)