perl - 如何找到带有 PPI 的注释,然后在它之前插入代码?

标签 perl ppi

我正在寻找评论 # VERSION在 perl 源文件中。然后我想在评论之前插入版本(或代替无关紧要)。谁能告诉我用 PPI 做到这一点的正确方法吗? ?


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


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

维护# VERSION最终结果是可选的

我实际上有一些关于如何找到 # VERSION 的想法,但一个是序列化 ppi 文档的正则表达式,这似乎不正确,另一个是在评论上使用 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);
    }
}

更新

这个问题的答案成为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 - 如何找到带有 PPI 的注释,然后在它之前插入代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3345230/

相关文章:

perl - 扩展非 Moose 类 : Not a HASH reference at accessor

android - 计算 Android 设备的 PPI

c# - C#和Photoshop在图像分辨率(ppi)上的区别

perl - 大致检查 Perl 代码的语法,比 perl -c 快

perl - 使用perl将基于染色体的 `.bed`文件拆分为 `chromosomeName.bed`

perl - 如何在 Perl 哈希表中存储多个值?

linux - 如何在每个父目录中打印最后一个目录

regex - while、数组和正则表达式的组合

android - 为 Android 设计 - 分辨率?