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