perl的#line指令的目的是什么?

Eug*_*ash 13 debugging perl

行指令(#line)用于重新配置perl对当前文件名和行号的概念.何时需要获取正确的文件名和行号(在错误消息中)?

msw*_*msw 16

通常将这些标记放入已经预处理或机械生成的代码中,以便返回到人类生成的源.

例如,如果有一个程序将Python转换为Perl,它可能会插入一个

# line 812 "foo.py"
Run Code Online (Sandbox Code Playgroud)

所以错误消息会引用原始的Python代码,这对程序员来说更有意义.


Mic*_*man 7

将Perl脚本包装在另一个文件中时它们很有用,比如pl2bat.Perl没有在文件开头看到批处理命令,这会抛出其行号的概念.一个#line在Perl的源代码开始指令补偿这一点.


Fel*_*lix 6

我已经多次看到人们错误地将当前行的编号写入#line指令.它应该包含下一行的编号.linetest.pl的示例代码(使用ksh包装器为perl脚本设置环境变量):

1  #!/usr/bin/ksh
2  MY_ENV_VAR='something'
3  export MY_ENV_VAR
4  /usr/bin/perl -x $0 $@ 2>&1
5  exit $?
6
7  #!/usr/bin/perl
8  #line 9
9  print "MY_ENV_VAR is $ENV{MY_ENV_VAR}\n";
10 die "This is line 10.";
Run Code Online (Sandbox Code Playgroud)

运行脚本并检查结果:

$ ./linetest.pl
MY_ENV_VAR is something
This is line 10. at ./linetest.pl line 10.
Run Code Online (Sandbox Code Playgroud)

#line 9在第8行写完后,您可以看到行号匹配.