use List::Util qw(shuffle); @list = shuffle @list; # now you can just shift() or pop() until @list is empty