use warnings; use strict; use Devel::Examine::Subs; use PPI; # unneeded, technically due to above use if (@ARGV != 2){ print "Usage: ./script.pl Good.pm Old.pm\n"; exit; } my @files = @ARGV; my @order; for my $file (@files){ my $outfile = "$file.new"; my $ppi_doc = PPI::Document->new($file); $ppi_doc->prune('PPI::Token::Pod'); $ppi_doc->prune('PPI::Token::Comment'); my @subs; for (@{ $ppi_doc->find('PPI::Statement::Sub') }){ push @subs, $_->name; } # set the order in the global var @order = @subs if ! @order; $ppi_doc->save($outfile); my ($des, $sub_obj_hash); { $des = Devel::Examine::Subs->new(file => $outfile); $sub_obj_hash = $des->objects(objects_in_hash => 1); } $ppi_doc = PPI::Document->new($outfile); $ppi_doc->prune('PPI::Statement::Sub'); $ppi_doc->save($outfile); $des = Devel::Examine::Subs->new(file => $outfile); my $first_line = $sub_obj_hash->{$subs[0]}->start; my @code; for (@order){ push @code, @{ $sub_obj_hash->{$_}->code }; } $des->inject(line_num => $first_line, code => \@code); }