Every other

Bob MacCallum uncoolbob at gmail.com
Fri Oct 30 09:21:06 GMT 2009


If your array is numeric:

use PDL;
my @old = (1..10);
my @new = pdl(@old)->slice("0:-1:2")->list;

although this is unlikely to be the most efficient way either (due to
the conversion between arrays and piddles).



On Fri, Oct 30, 2009 at 9:05 AM, Mark Fowler <mark at twoshortplanks.com> wrote:
> Hello,
>
> I have in the past coded things to only discover later that someone
> else has already written what I have toiled away on, only better.  So
> this time, I'm asking the experts[1] first.
>
> I have an array in Perl 5 [2].  I want *every* *other* element from
> it.  There is, of course, more than one way to do it:
>
> my @new;
> foreach (my $i = 0; $i < @old; $i++) {
>  push @new, $old[ $i ];
> }
>
> Or
>
> my $i;
> my @new = grep { $i = !$i } @old;
>
> Or so on.  None of these are particularly readable, or for that
> matter, blindly efficient (they still use quite a few ops for such a
> simple operation)
>
> What I would prefer is this:
>
> my @new = every_other @old;
>
> Which I guess could be generalised like so:
>
> i.e.
>
> everyother @array;
> everyother @array, $offset;
> everyother @array, $offset, $take_how_many;
> everyother @array, $offset, $take_how_many, $skip_how_many;
>
> (with the default being everyother @array, 0, 1, 1)
>
> e.g.
>
> Ideally this would be a utility in List::MoreUtils or suchlike, but
> it's not.  Ideally it'd be implemented in C as well as in Perl so that
> it doesn't burn ops for such a simple idea.
>
> Before I get going with the coding, does anyone know of anything else
> that can do this?
>
> Mark.
>
> [1] experts on Buffy that is.   Who might also happen to know some Perl.
> [2] There's very nice syntax for this in Perl 6, isn't there?  I'm not
> using that language yet.
>



-- 
http://evolectronica.com - survival of the funkiest



More information about the london.pm mailing list