1

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

何かを追加するポイントを見つける。しかし、再試行した後、機能しないと思います(スペースなしでコードを復元できないという事実は別として)。

4

1 に答える 1

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') } );

ただし、他のすべてのルール (「2 つのPPI::Token::Word要素間の空白は安全に削除できない」など) を列挙するのは難しい問題のように思えます。

于 2010-11-19T20:55:53.543 に答える