in reply to When does $_ get used?

This is partly a scoping issue, but mostly a void context issue. Variables declared with a foreach have a scope lexical to the associated block and in this case $_ is implied by the absence of an iterator. The variables in your while condition have no such luck. If you perform a shift operation in a void context, Perl is not going to assign a value to $_ automatically.

#!/usr/bin/perl -w use strict; my @list = ( 1, 2, 3, 'foo', 4, 'bar' ); $_ = 1; foreach (@list) { print "$_\n"; } print "between loops: $_\n"; while (shift @list) { print "$_\n"; } print "after loops: $_\n"; shift @list; shift @list; shift @list; print "$_\n"; #we are expecting 3, but it's really 1.


UPDATE: IMPORTANT NOTE. One thing we didn't mention here is that each time you are shifting @list, you are destroying your list, so eventually the list is completely destroyed which will cause the while condition to evaluate false and stop the while loop. But since we've destroyed the loop the final 3 shifts are actually operating on an empty list!