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!

In reply to (ichimunki) Re: When does $_ get used? by ichimunki
in thread When does $_ get used? by elbie

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.