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

时间:2010-03-10 16:16:11

标签: perl debugging

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

5 个答案:

答案 0 :(得分:16)

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

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

# line 812 "foo.py"

因此错误消息将引用原始的Python代码,这对程序员来说更有意义。

答案 1 :(得分:7)

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

答案 2 :(得分:6)

我多次看到人们错误地将当前行的编号写入#line指令。它应包含 next 行的编号。 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.";

运行脚本并检查结果:

$ ./linetest.pl
MY_ENV_VAR is something
This is line 10. at ./linetest.pl line 10.

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

答案 3 :(得分:1)

除了已经提到的原因perl有一个(强烈气馁)-P选项,它在执行之前通过C预处理器运行Perl文件。由于大多数C预处理器在包含或删除文件的一部分时将使用行指令,因此将从原始源而不是已处理源中的位置报告任何错误。

如果要在字符串中生成代码然后传递给eval,则行指令也非常有用。通常,如果此类代码中出现警告或错误,则会报告错误报告为“死于(eval 1)第1行”。使用行指令,您可以提供有用的文件名和行号。

答案 4 :(得分:1)

#line 指令在 shell 脚本中执行 perl -e 时也非常有用。我写

perl -e '#line X
more perl code here...
'

其中 X 是当前的 shell 脚本行 +1,因此任何 Perl 错误都会告诉我失败的 Perl 语句所在的 shell 行。