in reply to Circular buffer

Just use an array, and a scalar to point into the array.

my @buffer = (0) x 5; my $pointer = 0; for (0..30) { print "old value: ", $buffer[$pointer % @buffer], "\n"; print "new value: $_\n"; $buffer[$pointer % @buffer] = $_; $pointer++; }

Replies are listed 'Best First'.
Re^2: Circular buffer
by mellon85 (Monk) on Mar 20, 2011 at 17:11 UTC
    I don't like leaving the $pointer variable grow indefinitely.
    This code is equivalent, but keeps $pointer in [0,@buffer). In fact, just gets the remainder after each $pointer change
    my @buffer = (0) x 5; my $pointer = 0; for (0..30) { print "old value: ", $buffer[$pointer], "\n"; print "new value: $_\n"; $buffer[$pointer] = $_; $pointer = (++$pointer) % @buffer; }

      I usually avoid code like $pointer = (++$pointer) % @buffer; where the same variable is modified twice within the same expression. It means that the outcome depends on the order of evaluation, which isn't defined in all cases (it is in the case of assignment though).

      Instead I'd just write $pointer = (1 + $pointer) % @buffer.

      No $pointer. @buffer always ordered last to most recent.
      my @buffer = (0) x 5; for (0..30) { print "old value: ", $buffer[0], "\n"; print "new value: $_\n"; shift @buffer; push @buffer, $_; }