代码之家  ›  专栏  ›  技术社区  ›  sid_com

PPI-prune PPI::Token::空白-问题

  •  1
  • sid_com  · 技术社区  · 15 年前

    当我使用“$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空白,我可以使用这样的东西

    $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
        ...
        ...
    });
    

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

    1 回复  |  直到 15 年前
        1
  •  5
  •   mob    15 年前

    一些空格很重要,通常如果删除它,您将中断代码:

    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 元素是 不过,听起来是个棘手的问题。

    推荐文章