use strict; use warnings; use diagnostics; use Data::Dumper; my @buffer = qw[x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 y0 y1 y2 y3 y4 y5 y6]; my $bufsize = 10; my $diff = 2 * $bufsize - scalar(@buffer); my @smallbuf; for my $i (0..$#buffer) { if ($i < $bufsize - $diff) { swap($i, $i + $bufsize) } elsif ($i < $bufsize) { push @smallbuf, $buffer[$i]; mv($i+$diff, $i) } elsif ($i <= $#buffer - $diff) { mv($i+$diff, $i) } else { $buffer[$i] = shift @smallbuf; } } print Dumper @buffer; sub swap { my ($i, $j) = @_; $buffer[$i] = $buffer[$i] ^ $buffer[$j]; $buffer[$j] = $buffer[$i] ^ $buffer[$j]; $buffer[$i] = $buffer[$i] ^ $buffer[$j]; } sub mv { my ($from, $to) = @_; $buffer[$to] = $buffer[$from]; }