use strict; use warnings; my @buffer = qw[X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7]; sub swapsamesize { my( $s1, $s2, $n, $buf ) = @_; ($$buf[$s1+$_], $$buf[$s2+$_]) = ($$buf[$s2+$_], $$buf[$s1+$_]) for 0..$n-1; # too lazy to use $tmp } sub swapbuffers { my( $n1, $buf ) = @_; my $ntotal = @$buf; my $n2 = $ntotal - $n1; my $d = $n1 - $n2; print "$n1 $n2 $ntotal $d\n"; print "@$buf\n"; my( $s1, $s2, $n ) = ( 0, $n1, $n2 ); swapsamesize( $s1, $s2, $n, $buf ); print "@$buf\n"; ( $s1, $s2, $n ) = ( $n2, $ntotal - $d, $d ); swapsamesize( $s1, $s2, $n, $buf ); print "@$buf\n"; ( $s1, $s2, $n ) = ( $n2, $ntotal - 2 * $d, $d ); swapsamesize( $s1, $s2, $n, $buf ); print "@$buf\n"; ( $s1, $s2, $n ) = ( $n2, $ntotal - 3 * $d, $d ); swapsamesize( $s1, $s2, $n, $buf ); print "@$buf\n"; ( $s1, $s2, $n ) = ( $n2, $ntotal - 4 * $d, $d ); swapsamesize( $s1, $s2, $n, $buf ); print "@$buf\n"; } swapbuffers 10, \@buffer;