perl - PPI::Document 错误或一些特殊的子程序名称?

标签 perl parsing ppi

我对 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-numbers”或“version numbers”的概念有关。

v 编号类似于 v1.2.3 并解析为 PPI::Token::Number::Version 对象。

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

此外,在 sub 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/

相关文章:

python - 使用scp批量传输文件

c++ - 在我的代码中用 [] 替换 .at()

database - SQLite:我应该在断开连接之前分离附加的数据库吗?

json - 获取此输出 json 的所有值

python - 使用Python通过MapReduce在Hadoop中解析HTML .txt文件

android - 为 Android 设计 - 分辨率?

perl - 同时学习Perl和Catalyst是否可行?

c++ - std::string 一次性转换为 int/double

javascript - 如何在CSS中模拟真实世界的尺寸?

css - 从 ppi 计算像素大小