Recipe 4.16. Implementing a Circular List
Author: Tom Christiansen & Nathan Torkington
Date: 1999-07-02T01:32:13Z

#

| Chapter 4 Arrays |

## 4.16. Implementing a Circular List

### Problem

You want to create and manipulate a circular list.

### Solution

Use `unshift` and `pop` (or `push` and `shift`) on a normal array.

### Procedure

    unshift(@circular, pop(@circular));  # the last shall be first
    push(@circular, shift(@circular));   # and vice versa

### Discussion

Circular lists are commonly used to repeatedly process things in order; for example, connections to a server. The code shown above isn't a true computer science circular list, with pointers and true circularity. Instead, the operations provide for moving the last element to the first position, and vice versa.

    sub grab_and_rotate ( \@ ) {
        my $listref = shift;
        my $element = $listref->[0];
        push(@$listref, shift @$listref);
        return $element;
    }

    @processes = ( 1, 2, 3, 4, 5 );
    while (1) {
        $process = grab_and_rotate(@processes);
        print "Handling process $process\n";
        sleep 1;
    }

### See Also

The `unshift` and `push` functions in perlfunc (1) and Chapter 3 of Programming Perl; Recipe 13.13

4.15. Sorting a List by Computable Field |  | 4.17. Randomizing an Array