#! perl -slw use strict; sub rotateAll{ my( $aref, $n ) = @_; $n = $n % @{$aref}; return ( $n .. $#{$aref}, 0 .. $n-1 ); } sub rotateOne { my( $aref, $n, $i ) = @_; return ( $i + $n ) % @{$aref}; } my @a = 1 .. 5; print "Sliced"; printf "% 3d: %s\n", $_, join ' ', @a[ rotateAll( \@a, $_ ) ] for -7 .. 7; print "\nDiced"; for my $rot ( -7 .. 7 ) { printf "% 3d: ", $rot; print join ' ', map $a[ rotateOne( \@a, $rot, $_ ) ], 0 .. $#a; } __END__ C:\test>910117 Sliced -7: 4 5 1 2 3 -6: 5 1 2 3 4 -5: 1 2 3 4 5 -4: 2 3 4 5 1 -3: 3 4 5 1 2 -2: 4 5 1 2 3 -1: 5 1 2 3 4 0: 1 2 3 4 5 1: 2 3 4 5 1 2: 3 4 5 1 2 3: 4 5 1 2 3 4: 5 1 2 3 4 5: 1 2 3 4 5 6: 2 3 4 5 1 7: 3 4 5 1 2 Diced -7: 4 5 1 2 3 -6: 5 1 2 3 4 -5: 1 2 3 4 5 -4: 2 3 4 5 1 -3: 3 4 5 1 2 -2: 4 5 1 2 3 -1: 5 1 2 3 4 0: 1 2 3 4 5 1: 2 3 4 5 1 2: 3 4 5 1 2 3: 4 5 1 2 3 4: 5 1 2 3 4 5: 1 2 3 4 5 6: 2 3 4 5 1 7: 3 4 5 1 2