#!/usr/bin/perl -w
# e.pl (invoke as e or ee)
# Please see the POD for install and licensing details
use strict;
###### globals
my $version = "0.9";
my $comm;
my @stripped;
my $topline;
###### how we were called
chomp(my $us = qx!basename $0!);
if ( $us eq "ee" ) { $comm = ';'; } else { $comm = '#'; }
###### parse args
$#ARGV >= 2 && die("\n No more than 2 arguments\n\n");
defined $ARGV[0] || die(&usage($us));
my $ifile=$ARGV[0];
-e $ifile || die("\n Input file nonexistent.\n\n");
open(IFIL,"<$ifile") or die("problem opening input_file");
my @inputfile=<IFIL>;
close(IFIL);
###### main
if ( $us eq "ee" ) {
$topline = shift(@inputfile);
die(&pwarn($comm)) if $topline =~ /\#\!.*perl/i ;
unshift(@inputfile,$topline);
&stripper(@inputfile);
} elsif ( $us eq "e" ) {
$topline = shift(@inputfile);
if ( $topline =~ /(\s+)\#\!/ ) {
&stripper(@inputfile);
unshift(@stripped,$topline);
} else {
unshift(@inputfile,$topline);
&stripper(@inputfile);
}
}
###### final output
if ( $ARGV[1] ) {
open(OFIL,">$ARGV[1]") or die("problem creating output_file");
for ( @stripped ) { print OFIL "$_\n"; }
print "\n Done stripping $ifile\n -\> wrote output file \"$AR
+GV[1]\"\n\n";
close(OFIL);
} else {
for ( @stripped ) { print "$_\n"; }
}
exit $?;
###### subs
sub stripper {
for ( @_ ) {
chomp;
next if /^$comm|^(\s*)$comm|^(\s*)$/;
$_ =~ s/$comm.*$//;
push(@stripped,$_);
}
return @stripped;
}
sub usage {
print qq[
Usage: e filename [outputfilename]
··························································
+······
e strips comments and blank lines from an existing file.
e to remove # comments, and ee to strip ; comments.
See "perldoc e.pl"
··························································
+······
e.pl v$version invo
+ked as \'$us\'
];
exit(1);
}
sub pwarn {
print qq[
WARNING: Input file "$ifile" looks like a Perl script
The first line was: $topline
When invoked as \'$us\', e.pl strips out semicolons,
which might not be very useful for looking at a Perl scrip
+t.
If this assumption is wrong, remove the first line tempora
+rily.
];
&usage;
exit(1);
}
__END__
=head1 NAME
e (and ee), symbolic links to e.pl
=head1 VERSION
Version 0.9
=head1 SYNOPSIS
e (e.pl, to be invoked as either "e" or "ee")
e args
ee args
=head1 DESCRIPTION
B<e> (invoked as "e" or "ee") is a small program to strip unix style c
+omments ( e.g., "#" or ";" ) from scripts and configuration files. It
+ might be
useful during system administration. It is called "e" simply for brev
+ity.
B<e> also removes blank lines, makes some effort not to destroy shell
+scripts and shebangs, and tries to avoid mangling Perl scripts it enc
+ounters.
B<e> is meant to be run on Unix systems where #, #!, and ; are common
+comments/patterns.
B<e> requires at least one argument, a filename to be processed.
B<e> tries to detect if the first line of the input file contains the
+#! character sequence, and tries to preserve it, assuming it might be
+ a shell
script.
B<e> will stop and warn you about removing semi-colons from a file it
+thinks is a Perl script.
=head1 INSTALLATION
Install the main file, e.pl, somewhere in your path, then in the same
+directory, do
ln -s e.pl e
ln -s e.pl ee
Use e or ee, depending on what character you want to strip.
Invoking e.pl directly breaks it.
If you already have an e or ee on your system, you may use other symbo
+lic links,
If you rename these files, you will have to adjust the main script acc
+ordingly.
=head1 EXAMPLES
=over 4
=item B<e> I<input_filename>
Strips # comments and blank lines out of "filename" and sends the resu
+lt to your screen.
=item B<e> I<input_filename> [I<output_filename>]
Same as above, but the result will be written to a new file "output_fi
+lename" in the current directory.
=item B<ee> I<input_filename> [I<output_filename>]
Same as above, but semicolon as the comment character.
=back
=head1 BUGS
Might not be able to preserve the shebang line in a shell script, when
+ the shebang line is preceded by one or more blank lines.
=head1 LIMITATIONS
Does not remove C style comments.
Inefficiently written, so uses lots of memory when input files get lar
+ger.
Cannot detect a "here" document, and will happily destroy the contents
+ of one when it encounters a comment character somewhere in there.
=head1 AUTHOR
Harold Sinclair
devel at hastek
=head1 COPYRIGHT
Copyright ©2004 hastek. All rights reserved.
This program is free software; you can redistribute it and/or modify i
+t under the same terms as Perl itself.
=cut
#EOF
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.