perl – 如何在PPI中找到注释,然后在其前面插入代码?
发布时间:2020-12-16 06:16:23 所属栏目:大数据 来源:网络整理
导读:我试图在perl源文件中找到注释#VERSION.然后我想在评论之前插入版本(或代替无关紧要).有人能用 PPI告诉我正确的方法吗? 之前 use strict;use warnings;package My::Package;# VERSION... 后 use strict;use warnings;package My::Package;our $VERSION = 0.
我试图在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+VERSIONb$/ ) { $_->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+VERSIONb)$/ ) { my $code = "$1" . 'our $VERSION = ' . "$version;$2n"; $_->set_content("$code"); } } $ppi->save('test1.pm'); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |