Perl的#line指令有什么用途?

16

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


2
+1。我甚至不知道这个功能的存在。 - friedo
5个回答

17
通常这种标记会放在经过预处理或机械生成的代码中,以便参考人工生成的源代码。
例如,如果有一个将Python转换为Perl的程序,它可能会插入一个

标记来指示在哪里插入有关Python源代码的信息。
# line 812 "foo.py"

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


8

当将Perl脚本包装在另一个文件中时,它们非常有用,就像pl2bat一样。 Perl看不到文件开头的批处理命令,这会破坏其对行号的理解。在Perl源代码开头的#line指令可以弥补这一点。


7

我曾多次看到人们错误地将当前行号写入#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.

在第8行写上#line 9后,你会发现行号已经匹配。

2
除了已经提到的原因之外,perl还有一个(强烈不建议使用的)-P选项,在执行Perl文件之前会将其通过C预处理器运行。由于大多数C预处理器在包含或删除文件的部分时将使用行指令,因此任何错误都将报告其在原始源中的位置而不是处理后的源中。
如果您正在生成以字符串形式传递给eval的代码,则行指令也可能非常有用。通常,如果此类代码中存在警告或错误,则会报告类似于“在(eval 1)第1行死亡”的错误。使用行指令,您可以提供有用的文件名和行号。

2

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接