If any part of LIST is an array, foreach will get very confused if you add or remove elements within the loop body, for example with splice. So don't do that. #### my @arr = qw/foo bar baz quack/; for (@arr) { print $_, "\n"; shift @arr if $_ eq "bar"; } #### foo bar quack