如何获取具有子程序的起始行和结束行号的perl子程序列表?

时间:2015-06-24 13:56:40

标签: regex perl unix

我正在编写一个用于构建和升级分析的脚本,我需要在perl模块中定义所有子程序及其起始和结束行号。

实现这一目标的最佳方法是什么?

2 个答案:

答案 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+.*\{/或类似的东西)。然后你正在寻找收盘'}'。然后你必须循环遍历每个字符,寻找字符串和块标记,如[\(\)\{\}'"](我试图包括反引号,但它是为网页保留的)。这些应存储在一个数组中。这样您就可以跟踪自己的嵌套方式,并确定何时有正确的结束括号。在循环线条的同时,您可以跟踪您所在的线条。

我希望这会有所帮助。