【问题标题】:PPI - prune PPI::Token::Whitespace - questionPPI - 修剪 PPI::Token::Whitespace - 问题
【发布时间】:2010-11-19 18:36:18
【问题描述】:

当我使用“$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
    ...
    ...
});

找到一个点来附加一些东西。 但是知道重试后我认为它不能工作(除了事实上我无法恢复没有空格的代码)。

【问题讨论】:

  • 您能否在代码前后发布一些示例,包括您想要更改但没有得到更改的地方?

标签: perl perl-tidy


【解决方案1】:

一些空格很重要,一般来说,如果你删除它,你会破坏你的代码:

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 元素之间的空格可以安全删除”)听起来是个难题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多