my @items = (1,5,6,3,5,2,4); my $index = 0; sub do_next { do_something($items[$index]); $index = ($index+1) % @items; } #### my @items = (1,5,6,3,5,2,4); my $index = -1; sub add_item { push @items, @_; } sub do_next { if (@items) { $index = ($index+1) % @items; do_something($items[$index]); } else { $index = -1; } } #### sub remove_item { my %del = map {$_=>1} @_; my @part_1 = grep { !exists $del{$_} } @items[0..$index]; my @part_2 = grep { !exists $del{$_} } @items[$index+1..$#items]; $index = $#part_1; @items = (@part_1, @part_2); }