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
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
|