我正在编写一个用于构建和升级分析的脚本,我需要在perl模块中定义所有子程序及其起始和结束行号。
实现这一目标的最佳方法是什么?
答案 0 :(得分:5)
学习如何使用PPI
并非易事,但一旦这样做,使用PPI
来解决这个问题是微不足道的。
use PPI;
$FILE = ...;
$doc = PPI::Document->new($FILE);
$subs = $doc->find('PPI::Statement::Sub');
foreach my $sub (@$subs) {
my @t = $sub->tokens;
#my $name = $t[2]; # usually good enough to get the sub name
my $name = $sub->name;
my $start = $t[0]->location->[0];
my $end = $t[-1]->location->[0];
print "$name => $FILE: $start - $end\n";
}
答案 1 :(得分:-1)
哈!这听起来像一个有趣的问题。
我之前从未这样做过,但是从编写一些csv函数开始,我知道它可能看似复杂。这将是我的方法。你需要一个解析器。在解析器中,您必须知道子的开头是什么样的(基本上是/\s*sub\s+.*\{/
或类似的东西)。然后你正在寻找收盘'}'。然后你必须循环遍历每个字符,寻找字符串和块标记,如[\(\)\{\}'"]
(我试图包括反引号,但它是为网页保留的)。这些应存储在一个数组中。这样您就可以跟踪自己的嵌套方式,并确定何时有正确的结束括号。在循环线条的同时,您可以跟踪您所在的线条。
我希望这会有所帮助。