如何在Perl中打印源代码行号?

39

在Perl中是否可以获取当前源代码行号?C++中等价的是__LINE__


我在想:你为什么需要这个? - Leon Timmermans
5
我用它来快速追踪一个非常长的过程中的进展情况,并检查事情完成的顺序,就像使用断点但不使用调试器。 - David Sykes
@LeonTimmermans:我回复你很久以前的评论,关于为什么Perl程序员可能想要 _ FILE _ 和 _ LINE 。基本上,和C/C++程序员想要它们的原因是一样的。例如,今天我重构了一个测试,使得在子例程中调用了Test::Differences::eq_or_diff。报告的行号在子例程中而不是从哪里调用子例程。在测试名称中添加_ LINE __可以帮助我找到失败的测试。现在,如果我能在Perl5中编写一个宏CODE_LOCATION就好了。 - Krazy Glew
4个回答

64

__LINE__ 字面量在 perldata man pageSpecial Literals 部分有详细的文档说明。

print "File: ", __FILE__, " Line: ", __LINE__, "\n";
或者
warn("foo");

也许我做了一些不好的谷歌搜索,但对于我来说,99.999%的搜索结果都非常精确。对于这个问题,我基本上是用一个句子“如何在perl中打印当前行”进行搜索的,但我只得到了关于使用$.从读取文件中输出行号的回复,这就像在循环读取行时递增变量一样简单。所以我想知道是否有很多其他人也会遇到同样的问题。有趣的是,当我用不同的方式搜索时,谷歌似乎把这个问题放在了搜索结果中,或者我在最初的尝试中忽略了它。 - FantomX1

8
请注意,这里有一个需要注意的问题。
$ perl -e'warn("foo")'
foo at -e line 1.

如果以换行符结尾,它不会打印行号。
$ perl -e'warn("foo\n")'
foo

这在perldoc -f die中有记录,但在perldoc -f warn部分提到die时可能很容易被忽视。


2

"use Carp"并尝试使用不同的例程,您也可以获得堆栈 - 不确定这种方式是比cnd建议的“caller”方法更好还是更差。我曾经在C和Perl中使用LINE和FILE变量(以及可能其他类似的变量)来显示我在调试代码时的位置和其他信息,但在调试环境之外几乎没有什么价值。


2

这将打印出您所在的行以及“堆栈”(调用程序(脚本/模块等)的行列表,这些行导致您现在所在的位置)

while(my @where=caller($frame++)) { print "$frame:" . join(",",@where) . "\n"; }

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