Every other

Mark Fowler mark at twoshortplanks.com
Fri Oct 30 09:05:51 GMT 2009


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.


More information about the london.pm mailing list