#!/usr/bin/perl -w use strict; # Example script for removing trailing blank lines of code from a perl script # This is from the examples/ directory of the perltidy distribution and may # be modified as needed. # This was written in response to RT #118553, "leave only one newline at end of file". # Adding the requested feature to perltidy itself would have very undesirable # side-effects when perltidy is operated from within an editor. So it is best # done with a separate filter script on entire files. # usage: # delete_ending_blank_lines.pl myfile.pl >myfile.new # delete_ending_blank_lines.pl myfile.new use Getopt::Std; use Perl::Tidy; use IO::File; $| = 1; use vars qw($opt_h); my $usage = <outfile EOM getopts('h') or die "$usage"; if ($opt_h) { die $usage } # Make the source for perltidy, which will be a filehandle # or just '-' if the source is stdin my ($file, $fh, $source); if ( @ARGV == 0 ) { $source = '-'; } elsif ( @ARGV == 1 ) { $file = $ARGV[0]; $fh = IO::File->new( $file, 'r' ); unless ($fh) { die "cannot open '$file': $!\n" } $source = $fh; } else { die $usage } # make the callback object my $formatter = MyFormatter->new(); my $dest; # start perltidy, which will start calling our write_line() my $err=perltidy( 'formatter' => $formatter, # callback object 'source' => $source, 'destination' => \$dest, # (not really needed) 'argv' => "-npro -se", # dont need .perltidyrc # errors to STDOUT ); if ($err) { die "Error calling perltidy\n"; } $fh->close() if $fh; package MyFormatter; my @lines; sub new { my ($class) = @_; bless {}, $class; } sub write_line { # This is called from perltidy line-by-line; we just save lines my $self = shift; my $line_of_tokens = shift; push @lines, $line_of_tokens; } # called once after the last line of a file sub finish_formatting { my $self = shift; # remove all trailing blank lines of code while (my $line_of_tokens = pop(@lines)) { my $line_type = $line_of_tokens->{_line_type}; my $input_line = $line_of_tokens->{_line_text}; if ( $line_type eq 'CODE' ) { chomp $input_line; next unless ($input_line); } push @lines, $line_of_tokens; last; } # write remaining lines foreach my $line_of_tokens (@lines) { my $line_type = $line_of_tokens->{_line_type}; my $input_line = $line_of_tokens->{_line_text}; print $input_line; } return; }