I tend to like the mathematical solutions instead.
The following would let you reverse any N elements at a time in an array.
my @foo = (1..15); my $n = 5; my @bar = @foo[map {$_ + $n - 1 - 2 * ($_ % $n)} (0..$#foo)]; print "@bar";
Outputs
5 4 3 2 1 10 9 8 7 6 15 14 13 12 11
Obviously not as spiffy as using xor to switch odds and evens, but still pretty concise.
Alternatively, if you want to do a rotation of the elements instead of a reversal, you can use the following translation:
my @foo = (1..15); my $n = 5; my $i = 2; my @bar = @foo[map {my $r = $_ % $n; $_ - $r + (($r + $i) % $n)} (0..$ +#foo)]; print "@bar";
Outputs
3 4 5 1 2 8 9 10 6 7 13 14 15 11 12
- Miller
In reply to Re^4: Switch the odd/even elements of an array
by wind
in thread Switch the odd/even elements of an array
by jaredor
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |