gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:49:05 27 4
gpt4 key购买 nike

我正在寻找评论 # 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com