2010-11-19 6 views
1

Wenn ich "$ module-> Prune ('PPI :: Token :: Whitespace');" und speichern Sie die Ergebnisse in $ Datei gibt es einen einfachen Weg zurück zu funktionierenden Code für den gespeicherten Code? Ich habe versucht "Perl :: Tidy" und es sieht viel besser danach aber ID nicht alle beheben.PPI - Prune PPI :: Token :: Whitespace - Frage

#!/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 $!; 

edit:

Ich bin nicht mehr in der Lage meinen Code zu rekonstruieren, die ich in erster Linie hatte. Mit Prune-Leerzeichen aktiviert ich so etwas wie dieses

$a = $module->find(sub { 
    $_[1]->isa('PPI::Statement') and 
    $_[1]->content eq q(if([email protected]){$have_Term_ReadKey=0;$have_Term_Size=1;eval'require "Term/Size.pm"';if([email protected]){$have_Term_Size=0;}}) 
}); 

statt

$a = $module->find(sub { 
    $_[1]->isa('PPI::Statement') and 
    $_[1]->schild(0)->content eq q(if) and 
    $_[1]->schild(1)->isa('PPI::Something') and 
    ... 
    ... 
}); 

verwenden könnte um einen Punkt zu finden, um etwas anhängen. Aber nach dem erneuten Versuch weiß ich, dass es nicht funktionieren kann (abgesehen davon, dass ich den Code nicht ohne Leerzeichen wiederherstellen kann).

+0

könnten Sie einige Beispiele vor und nach dem Code posten, einschließlich wo Sie Änderungen wünschen, aber nicht bekommen? –

Antwort

5

Einige Leerzeichen ist signifikant und in der Regel werden Sie Ihren Code brechen, wenn Sie es entfernen:

use PPI; 
$document = PPI::Document->new(\'sub sq{$_[0]**2}'); 
$document->prune('PPI::Token::Whitespace'); 
print $document->serialize; 

Die Ausgabe dieses Programms ist:

subsq{$_[0]**2} 

Oops. Es gibt nichts Perl::Tidy kann darüber tun.


Es wäre sicher sein (ich glaube - nicht von einer Gegen denken kann) zu entfernen, die Top-Level- Leerzeichen

# just prune top-level whitespace 
$document->prune( sub { $_[1]->parent->isa('PPI::Document') 
         and $_[1]->isa('PPI::Token::Whitespace') }); 

alle anderen Regeln Aufzählen (wie " Leerzeichen zwischen zwei PPI::Token::Word Elemente ist nicht sicher zu entfernen ") klingt wie ein schweres Problem, obwohl.