perl – 如何在PPI中找到注释,然后在其前面插入代码?

前端之家收集整理的这篇文章主要介绍了perl – 如何在PPI中找到注释,然后在其前面插入代码?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在perl源文件中找到注释#VERSION.然后我想在评论之前插入版本(或代替无关紧要).有人能用 PPI告诉我正确的方法吗?

之前

use strict;
use warnings;
package My::Package;
# VERSION
...

use strict;
use warnings;
package My::Package;
our $VERSION = 0.1;# VERSION
...

在最终结果中保持#VERSION是可选的

我实际上有一些关于如何找到#VERSION的想法,但有一个是序列化的ppi doc的正则表达式,这似乎不正确,另一个是在评论中使用find_first,但如果它不是第一个我不确定该怎么办.

更新的代码这似乎更接近正确的解决方案,因为它只查看注释.但我不知道如何使用或真正如何创建一个新的变量.

#!/usr/bin/env perl
use 5.012;
use strict;
use warnings;

use PPI;

my $ppi = PPI::Document->new('test.pm');

my $comments = $ppi->find('PPI::Token::Comment');

my $version = PPI::Statement::Variable->new;

foreach ( @{$comments} ) {
    if ( /^\s*#\s+VERSION\b$/ ) {
        $_->replace($version);
    }
}

UPDATE

这个问题的答案成为DZP::OurPkgVersion的基础

解决方法

这里有一些代码可以完成您所描述的内容 – 无论如何它都可以让您入门.它是从 Catalyst::Helper::AuthDBIC( source)编辑的,这是使用PPI的完整示例(虽然它可能不是最佳实践):

sub make_model {
    ### snip some stuff
    my $module = "lib/$user_schema_path.pm";
    my $doc = PPI::Document->new($module);
    my $digest_code = # some code
    my $comments = $doc->find(
        sub { $_[1]->isa('PPI::Token::Comment')}
    );
    my $last_comment = $comments->[$#{$comments}];
    $last_comment->set_content($digest_code);
    $doc->save($module);
}

我想在你的情况下你抓住$comments arrayref并修改匹配/ VERSION /的第一项与替换内容.

这是最后的代码礼貌的海报:

#!/usr/bin/env perl
use 5.012;
use warnings;

use PPI;

my $ppi = PPI::Document->new('test.pm');

my $comments = $ppi->find('PPI::Token::Comment');

my $version = 0.01;

my $_;
foreach ( @{$comments} ) {
    if ( /^(\s*)(#\s+VERSION\b)$/ ) {
        my $code = "$1" . 'our $VERSION = ' . "$version;$2\n";
        $_->set_content("$code");
    }
}
$ppi->save('test1.pm');

猜你在找的Perl相关文章