#!/usr/bin/env perl use warnings; use strict; use 5.010; use PPI; my $raw = <<'__RAW__'; package FeeFi; sub Fee { print "Fee\n"; } sub Fi { print "Fi\n"; } 1; __RAW__ my %sub_h; { my $document = PPI::Document->new(\$raw) or die "oops!"; $document->save('before'); for my $sub (@{$document->find('PPI::Statement::Sub') || []}) { next if $sub->forward; $sub_h{$sub->name}{content} = $sub->content; my @elements = $sub->block->children; for (my $i=0; $i < @elements; $i++) { $elements[$i]->remove; } } $sub_h{''}{content} = $document->content; } { my $document = PPI::Document->new(\$sub_h{''}{content}) or die "oops creating ''!"; for my $stub (@{$document->find('PPI::Statement::Sub') || []}) { next if $stub->forward; # 1. store the document in its own variable my $doc = PPI::Document->new(\$sub_h{$stub->name}{content}); my $sub = $doc->find_first('PPI::Statement::Sub'); # 2. remove the sub element from its document $stub->insert_after($sub->remove) or warn "Can't insert_after!"; # 3. remove the stub $stub->remove; } $document->save('after'); }