行指令 (#line) 用于重新配置 Perl 对当前文件名和行号的概念。在何时需要使用它来获取正确的文件名和行号(在错误消息中)?
# line 812 "foo.py"
这样错误消息将引用原始的Python代码,这对程序员更有意义。
当将Perl脚本包装在另一个文件中时,它们非常有用,就像pl2bat一样。 Perl看不到文件开头的批处理命令,这会破坏其对行号的理解。在Perl源代码开头的#line
指令可以弥补这一点。
我曾多次看到人们错误地将当前行号写入#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.";
$ ./linetest.pl
MY_ENV_VAR is something
This is line 10. at ./linetest.pl line 10.
#line 9
后,你会发现行号已经匹配。perl
还有一个(强烈不建议使用的)-P
选项,在执行Perl文件之前会将其通过C预处理器运行。由于大多数C预处理器在包含或删除文件的部分时将使用行指令,因此任何错误都将报告其在原始源中的位置而不是处理后的源中。eval
的代码,则行指令也可能非常有用。通常,如果此类代码中存在警告或错误,则会报告类似于“在(eval 1)第1行死亡”的错误。使用行指令,您可以提供有用的文件名和行号。#line指令在shell脚本中执行perl -e
时也非常有用。我写的:
perl -e '#line X
more perl code here...
'
X是当前的shell脚本行数+1,这样任何Perl错误都会告诉我失败的Perl语句所在的shell行。