SPUG: interesting while() behavior and hosting recs
DeRykus, Charles E
charles.e.derykus at boeing.com
Fri Oct 1 13:34:45 CDT 2004
On Fri, Oct 01, 2004 at 08:25:02AM -0700, DeRykus, Charles E wrote:
>
> But, as we've seen Joel's post, the effects of a "list in scalar
> context" in a different may altogether different and unexpected... ie,
> while () ... gets parsed as for (;;). Charles DeRykus
That sentence parses like a "mind in void context"...
> Specifically, what qualifies
> while () { statement; }
> as having /anything/ to do with the conceptually understandable (albeit technically non-> > existent) "list in scalar context"?
> Or, for that matter, the parens in while's close relative:
> if () { statement; }
> AFAIK, those parens after the keywords are *required elements of
> syntax* that have nothing to do with the kind of "list formation" effect that people
> associate with expressions like:
> @stuff=(1,2,3);
> and @stuff=(); # empty list
> It seems to me that earlier posts are equating the parens in "while ()..." to those in my > empty list example above, which conflicts with my interpretation that they are merely > syntactic elements after "while".
You're right. I was was over-generalizing... those parens are syntactic
requirements and shouldn't have been tossed into the "list in scalar
context" discussion.
Maybe my "list in scalar context" just to provide a semantic handle for
for parens that don't parse or work the way you think they do is a bad
idea. But as you can see, parens are a tricky issue. John cites a whole
thread that I presume discusses some of these subtleties.
For instance, if the original expression were changed to:
while (()) {... # instead of while ()
There would be no problem and would work exactly the same as
@empty = ();
while ( @empty) {...
Yet, the inner paren's might be mistaken for a list. I'm
not totally sure what's happening.
And to repeat another subtlety I mentioned earlier, look what Perl does here:
$ perl -MO=Deparse -e '$c=1;while ( ("a","b","c") ) {
print "hello,world";last if ++$c>3;}'
$c = 1;
while ('???', '???', 'c') {
print 'hello,world';
last if ++$c > 3;
}
-e syntax OK
The ("a","b","c") might easily convince someone they had a "list in scalar context"
even though it's not. But Perl treats this altogether differently than
$scalar = ("a","b","c") where the list would resolve with a comma operator.
Deep magic.
Cheers,
--
Charles DeRykus
P.S.
This is one of the really difficult areas. I think that's why the doc's gloss
over much of the fine print.
> I'll readily admit that I, like many JAPHs, have some of my own ways of thinking
> about Perl that make it easier for me to use, and to teach, and that usually serve me
> quite well -- despite their technically being over-simplifications of Perl's (twisted)
> reality. 8-}
> As a case in point, I offer the widespread notion that parens function as "list
> constructors" in expressions like "@array=(1,2)" and "print (1,2)", which is
> tremendously useful, despite being less than a perfectly accurate representation
> of how those expressions are actually parsed and evaluated, IIRC. (What's the real
> story? Is it that the comma operator in list context returns all the expressions,
> so the parens are just there for reasons of precedence in the case of an assignment?)
> Surely, even in Perl, there are some elements of basic syntax that can be trusted
> to have concrete meanings -- like while's parens; aren't there? 8-}
More information about the spug-list
mailing list