> [EMAIL PROTECTED] - Sat May 05 21:48:58 2001]: > > . I run my perl scripts through cpp (for various reasons). I can't > use > the -P option because I use libraries and such which all need to be > run > through cpp. > > . The output from cpp contains # lines of the form (for example): > > # 1 "/src/5.5longdistance/public_html/page.pc" > # 1 "/src/5.5longdistance/include/ld.h" 1 > # 1 "/src/nbn/include/display.h" 1 > # 1 "/src/nbn/include/class.h" 1 > BEGIN {push(@INC, '/src/nbn/widgets', '/src/nbn/comm', > '/virtuals/americom/lib')} > use Object; > # 3 "/src/nbn/include/display.h" 2 > # 1 "/src/5.5longdistance/include/ld.h" 2 > # 1 "/src/5.5longdistance/public_html/page.pc" 2 > use Display; > unlink '/tmp/Errors'; > #send errors to /tmp/Errors if not running in the debugger > $inDebugger = $INC{'/home/rwk/.perldb'}; > if (!$inDebugger) { > open(STDERR, '> /tmp/Errors'); > open(STDOUT, '| /usr/bin/tee --append /tmp/html') if -e > '/tmp/DumpHtml'; > } else { > open(STDERR, ">&STDOUT"); > } > FORM::Execute(); > END { > if (!$inDebugger && ! -z '/tmp/Errors') { > #in case they occured before heading was printed > print "Content-type: text/html\n\n"; > print "<PRE>\n"; > my(@errors) = `cat /tmp/Errors`; > print @errors; > } > } > > . When running the above in the perl debugger under perl5.004_04, it > correctly visits the source file and line specified by the # source > lines in the file. This make debugging easy, particularly within > emacs. > > . Under perl5.6, it fails to do this and simply visits the file with > the > # source lines, rather than the file they refer to. > > Can anyone tell me if there is a fix or work-arround for this problem?
You are correct in that Perl prior to 5.6 honored these comments and that 5.6 and after do not. $ cat ~/tmp/foo #!/usr/bin/perl -w # 1 "/usr/include/ndbm.h" warn "Foo"; 0 ~/tmp$ perl5.4.5 ~/tmp/test Foo at /usr/include/ndbm.h line 1. 0 ~/tmp$ perl5.5.4 ~/tmp/test Foo at /usr/include/ndbm.h line 1. 0 ~/tmp$ perl5.6.2 ~/tmp/test Foo at /Users/schwern/tmp/test line 4. 0 ~/tmp$ perl5.8.6 ~/tmp/test Foo at /Users/schwern/tmp/test line 4. However it was never documented that it would do so. It appears to have been a quirk in the processing of "#line" directives, which are documented at the end of perlsyn, that "line" was optional. I think it was this change which clarified the behavior to avoid picking up random comments as line directives. http://public.activestate.com/cgi-bin/perlbrowse?patch=5108 - if (strnEQ(s, "line ", 5)) { - s += 5; - sawline = 1; - } + if (strnEQ(s, "line", 4)) + s += 4; + else + return; Before it would continue processing a comment as a possible #line directive even if it did not see "line". After it would stop if it did not see "line". The work around is to use the documented "#line 4 filename" comments as documented in perlsyn. Sorry if cpp does not output these.