eversole@acae037.cadence.com (Richard Eversole; x6239) (06/28/91)
#!/util/bin/perl
# ^-----------^---- replace with your favorite perl path
#
# This script shows an interesting anomaly of perl
#
# Could some one please explain why this happens and
# why the last print is a parse error.
#
# I kind of understand that perl is not able to determine
# that $ofile is a file handle in the last example.
#
# My question is: Shouldn't perl be able to correctly parse
# this ?
#
# $Header: perl.c,v 4.0 91/03/20 01:37:44 lwall Locked $
# Patch level: 0
#
$ofile = STDOUT ;
print $ofile '',<<EOD ;
This works
EOD
print STDOUT <<EOD;
This works
EOD
print $ofile <<EOD;
This returns the parse error
parse error in file bug.pl at line 30, next 2 tokens "This returns"
Execution of bug.pl aborted due to compilation errors.
EOD
--
=====================================================================
eversole@cadence.com
Live long and prosper !merlyn@iWarp.intel.com (Randal L. Schwartz) (06/28/91)
In article <1991Jun27.180332.6471@cadence.com>, eversole@acae037 (Richard Eversole; x6239) writes: | print $ofile <<EOD; | This returns the parse error | parse error in file bug.pl at line 30, next 2 tokens "This returns" | Execution of bug.pl aborted due to compilation errors. | EOD Ugh. Consider the difference between: print $ofile <<EOD; print <<EOD; EOD and print $ofile <<3; print <<EOD; EOD You cannot know that the $ofile is a handle until you have seen the 3. That's too far for the one-token-ahead parser to go. It presumes you mean left-shift in this case. Try this as a workaround: print $ofile (<<EOD); print <<EOD; EOD Pages 86 and 87 of the First Edition of The Book give the entire chart of context-sensitive operators and a description of the pitfalls. (Note the words "First Edition".... hmmm.... :-) print "Just another Perl hacker," x (1024 >> 10) -- /=Randal L. Schwartz, Stonehenge Consulting Services (503)777-0095 ==========\ | on contract to Intel's iWarp project, Beaverton, Oregon, USA, Sol III | | merlyn@iwarp.intel.com ...!any-MX-mailer-like-uunet!iwarp.intel.com!merlyn | \=Cute Quote: "Intel: putting the 'backward' in 'backward compatible'..."====/
flee@cs.psu.edu (Felix Lee) (06/30/91)
It's actually the tokenizer that knows the difference between left-shift and here-is quoting. The scanner keeps track of whether it just saw an operator and uses this to decide what + - . * x / % & < and << mean. -- Felix Lee flee@cs.psu.edu