I guess the solution for this is quite simple, but I’ve been thinking about it for a while and couldn’t come up with an elegant solution.
I have a range of numbers, e.g. 1..10 = (1,2,3,4,5,6,7,8,9,10), which is circular, meaning the number after the last one is again the first one (next(10)=1).
For a given number i>0 in the range, I would like to calculate the next m-th, and previous m-th number. e.g. next(5,1)=6 next(10,1)=1 next(10,2)=2 prev(5,2)=3 prev(1,1)=10 prev(1,2)=9.
For next I can just take (i+m)%n where n is the length of the range (n=10 in the example). But for prev I couldn’t find an elegant solution.
Just subtract 1 and add 1 afterwards.
In most programming languages, you need to watch out when finding a “previous” value, because for negative numbers, modulo does not work as you want in this case: it returns a negative number.
Here’s the C/C++ version:
However, in Perl modulo always returns a positive value (at least when the second operand is a positive integer). Basically it does what you want. So you can write the following and leave out the
+ $_[2]: