in reply to split every other value

That begs a question of semantics. Do you mean the even vs odd values?

Then the common idiom would be something like

my (@even, @odd); push @{ $_ % 2 ? \@odd : \@even }, $_ for split /,/, $text;

Here, you loop over all the elements, giving push either @odd or @even to push the element onto, depending on whether the element is odd or even. The awkward @{ ... } construct is necessary because push demands that its first argument have a @ sigil in front, no matter what.

Or, do you mean the even vs odd positions in the list?

Then you'd use something like

my (@even, @odd); my $i = 0; push @{ $i++ % 2 ? \@odd : \@even }, $_ for split /,/, $text;

Here, you increase a position counter at each iteration, and make the decision depending on its even/oddness.

Update: see Re^6: split every other value about the following code and Re^7: split every other value for my reply with a correct derivative.

Another option in this case is something like

my @field = split /,/, $text; my (@even, @odd) = @field[ map { $_, $_ + @field / 2 } 0 .. ( @field / 2 ) - 1 ];

Makeshifts last the longest.

Replies are listed 'Best First'.
Re^2: split every other value
by beable (Friar) on Aug 07, 2004 at 00:18 UTC
    That won't work for text, however, which is what the problem supposedly really is. jcpunk wants to split on odd/even array indexes, not on the odd/evenness of the array element.

    Update: Oh good, you have a second version which divides the stuff up on array index.

      Read the code again. That's exactly what it does.

      Makeshifts last the longest.

        Err, no. When I replied to your post, it only dealt with numbers as elements. You've since changed your post by adding the second program. Here is a demonstration that the first version of your post does not work for text:
        #!/usr/bin/perl #my $text = '1,2,3,4,5,6,7,8'; my $text = 'a,b,c,d,e,f,g,h,i,j'; my (@even, @odd); push @{ $_ % 2 ? \@odd : \@even }, $_ for split /,/, $text; print "odd = @odd, even = @even\n"; __END__ output (first $text): odd = 1 3 5 7, even = 2 4 6 8 output (second $text): odd = , even = a b c d e f g h i j