我对PPI模块有一些问题:

假设我有Foo.pm:

package Foo;

sub foo0 { 1; }
sub foo1 { 1; }
sub foo2 { 1; }
sub foo3 { 1; }

1;

我想使用PPI来获取所有的潜艇:
#!/usr/bin/env perl
use PPI;
my $filename = shift;
my $Document = PPI::Document->new($filename);
my $subs = $Document->find('PPI::Statement::Sub');
warn $#$subs;

结果我得到了“3”,这是正确的。

但是当我在Foo.pm中的子项目之一称为“sub vN ...”时,其中N是一个数字,例如:
sub v1foo {}

或者
sub v3bar {}

或简单地
sub v2 {}

PPI::Document find似乎中断了解析,仅返回已经找到的子项。
因此,如果我修改Foo:
package Foo;

sub foo0 { 1; }
sub foo1 { 1; }
sub v2xx { 1; }
sub foo3 { 1; }

1;

我的测试结果将为“1”(找到的子项为foo0和foo1)

是否以某种方式禁止声明像v [0..9]这样的子例程名称?

问候。

最佳答案

这是一个(未知)错误。

它与“v数”或“版本号”的概念有关。

一个v编号看起来像v1.2.3一样,并将其解析为一个PPI::Token::Number::Version对象。

您看到的问题是解析发现“v,数字,...”,将其解析为v-数字,然后在其后的字符处开始下一个标记(这是不应该的)。

另外,在子v1 {}的情况下,v1应该解析为子例程名称“v1”,而不是v编号。

您应该在https://rt.cpan.org/Public/Dist/Display.html?Name=PPI上报告此PPI错误跟踪器

关于perl - PPI::Document错误或某些特殊的子例程名称?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9063067/

10-09 20:37