Alternatively, just the declaration could be moved out of the for:
my $d; foreach ($d = 'Shakespear is the food') { s/foo/bar/; }
I think that would be my preference, although your suggestion (modulo typos) is perfectly fine.
I believe that the behavior allowing it to work in the case of the 'for' modifier is not defined, and thus may change in future Perl refinements.
Certainly the scoping of the variable is defined, and according to perlsyn, "a declaration can be put anywhere a statement can," and "apart from declaring a variable name, the declaration acts like an ordinary statement, and is elaborated within the sequence of statements as if it were an ordinary statement. That means it actually has both compile-time and run-time effects."

I think the behavior is pretty well-defined by that. The only issue is the scoping difference between predicate-for and block-for, which Deparse didn't accout for.

By the way, I agree that this trick is not for mainstream code. Nifty tricks are not elegant solutions, but they can be useful for getting a better understanding of what lies behind a limitation.
And it's less ugly than

(sub { $_[0] =~ s/foo/bar/ })->(my $d = 'Shakespear is the food');
(which Deparse doesn't change materially) :-)

Caution: Contents may have been coded under pressure.

In reply to Re^2: Deparse broken or just misunderstood? by Roy Johnson
in thread Deparse broken or just misunderstood? by Roy Johnson

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.