2010-11-19 27 views
1

Lorsque j'utilise "$ module-> prune ('PPI :: Token :: Whitespace');" et enregistrer les résultats dans le fichier $ est-il une facilité de retour au code de travail pour le code enregistré? J'ai essayé "Perl :: Tidy" et ça a l'air beaucoup mieux après ça mais l'id ne corrige pas tout.PPI - prune PPI :: Token :: Whitespace - question

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

modifier:

Je ne suis plus en mesure de reconstituer mon code que j'avais en premier lieu. Avec pruneau-espaces blancs a permis que je pourrais utiliser quelque chose comme ça

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

au lieu de

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

pour trouver un point d'ajouter quelque chose. Mais sachez qu'après avoir réessayé je pense qu'il ne peut pas fonctionner (à part le fait, que je ne peux pas restaurer le code sans les espaces).

+0

pourriez-vous poster un exemple avant et après le code, y compris où vous voulez des changements, mais ne les obtiennent pas? –

Répondre

5

Certains espaces blancs sont significatifs et en général vous casser votre code si vous supprimez:

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

La sortie de ce programme est:

subsq{$_[0]**2} 

Oops. Il n'y a rien que Perl::Tidy peut faire à ce sujet.


Il serait prudent (je pense - ne peut pas penser à une contre-) pour enlever le haut niveau des espaces

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

Énumérer toutes les autres règles (comme " espace entre deux éléments PPI::Token::Word est pas sûr de supprimer ") semble un problème difficile, cependant.