PPI :: Ошибка документа или какое-то специальное имя подпрограммы? - PullRequest
5 голосов
/ 30 января 2012

У меня есть некоторые проблемы с модулем 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 :: Поиск документа, кажется, прерывает разбор и возвращает только уже найденные подпрограммы.Поэтому, если я изменю Foo:

package Foo;

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

1;

Результатом моего теста будет "1" (найдены подпрограммы foo0 и foo1)

Объявляет имена подпрограмм наподобие v [0..9]как-то запрещено?

Привет.

1 Ответ

5 голосов
/ 30 января 2012

Это (неизвестная) ошибка.

Это связано с понятием "v-числа" или "номера версий".

Число v выглядит примерно как v1.2.3и синтаксические анализаторы в объект PPI ​​:: Token :: Number :: Version.

Проблема, с которой вы сталкиваетесь, состоит в том, что при синтаксическом анализе обнаруживается «v, digit, ...», анализируется как v-число и затемзапуск следующего токена на символе после него (чего он не должен делать).

Кроме того, в случае sub v1 {} v1 должен быть проанализирован как имя подпрограммы "v1" вместо v-номер в любом случае.

Вы должны сообщить об этом трекере ошибок PPI в https://rt.cpan.org/Public/Dist/Display.html?Name=PPI

...