Because the array is passed on to another function
As a list or an array ref?
If the former, then you can again avoid physically moving the data by slicing it to produce the list.
Of course, if you are only rotating the array once per program run, then it doesn't much matter. But if you need several different rotations during the program run, then it might make sense to avoid moving everything multiple times, if possible.
Silly example code:
#! 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
In reply to Re^3: Rotating an array
by BrowserUk
in thread Rotating an array
by rovf
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |