4

# VERSIONperlソースファイルでコメントを見つけようとしています。次に、コメントの前に(または代わりに)バージョンを挿入します。誰かがPPIでこれを行う正しい方法を教えてもらえますか?

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

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

# VERSION最終結果での維持はオプションです

私は実際に#VERSIONを見つける方法についていくつかのアイデアを持っていますが、1つは正しくないように見えるシリアル化されたppiドキュメントの正規表現であり、もう1つはコメントで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の基盤になりました

4

1 に答える 1

4

これがあなたが説明するようなことをするいくつかのコードです-それはとにかくあなたを始めるでしょう。これは、 Catalyst :: Helper :: AuthDBICソース)から編集されています。これは、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');
于 2010-07-27T23:40:52.833 に答える