当我使用“$ module-> prune('PPI :: Token :: Whitespace');”并将结果保存在$ file中是否可以轻松返回已保存代码的工作代码?我尝试了“Perl :: Tidy”,在此之后看起来好多了但是id并没有解决所有问题。
#!/usr/bin/env perl
use warnings;
use 5.012;
use PPI;
my $file = 'my_file.pm';
my $module = PPI::Document->new( $file );
$module->prune( 'PPI::Token::Pod' );
$module->prune( 'PPI::Token::Comment' );
$module->prune( 'PPI::Token::Whitespace' );
# ...
# ...
$module->save( $file ) or die $!;
编辑:
我无法再重建我的代码。启用prune-whitespace后,我可以使用类似这样的东西
$a = $module->find( sub {
$_[1]->isa('PPI::Statement') and
$_[1]->content eq q(if($@){$have_Term_ReadKey=0;$have_Term_Size=1;eval'require "Term/Size.pm"';if($@){$have_Term_Size=0;}})
});
而不是
$a = $module->find( sub {
$_[1]->isa('PPI::Statement') and
$_[1]->schild(0)->content eq q(if) and
$_[1]->schild(1)->isa('PPI::Something') and
...
...
});
寻找附加内容的点。 但是在重试后知道我认为它不起作用(除了事实,我没有修复代码没有恢复代码)。
答案 0 :(得分:5)
有些空格非常重要,一般来说,如果删除它,您将破坏代码:
use PPI;
$document = PPI::Document->new(\'sub sq{$_[0]**2}');
$document->prune('PPI::Token::Whitespace');
print $document->serialize;
该程序的输出是:
subsq{$_[0]**2}
糟糕。 Perl::Tidy
无法做到这一点。
<小时/>
删除顶级空格是安全的(我认为 - 无法想到反例)
# just prune top-level whitespace
$document->prune( sub { $_[1]->parent->isa('PPI::Document')
and $_[1]->isa('PPI::Token::Whitespace') } );
枚举所有其他规则(例如“两个PPI::Token::Word
元素之间的空格是不安全删除”)听起来像是一个难题。