Shawn Milochik wrote:
> Hello all.
Hello,
> I've been spending too much money lately on Amazon buying
> Perl books. Recently, I've been playing with scripts downloaded from
> the Web site of a book I'm going through. For some reason, some of the
> .pl files have a shebang, and others do not.
>
> 1. What's the difference, other than whether you have to run them by
> calling Perl or not?
>
> 2. I cobbled together a little Perl script to add the shebang where it
> doesn't exist. I'd appreciate any feedback, especially any suggestions
> if I'm doing anything weird, or it could be done better or more
> "Perlishly."
>
> ------------------------------------------------------------------------
> begin script
> ------------------------------------------------------------------------
> #!/usr/bin/perl
>
> #add_shebang.pl
> #possible use: ls | ./add_shebang.pl
That is one way to do it. Another way is "./add_shebang.pl *.pl" and have the
file names available in the @ARGV array, and you could even use the in-place
edit variable ($^I) to modify the files "in-place". Or you could just use
glob() or opendir()/readdir() to get the file names. The main problem with
using standard input as in your example is that the shell may modify the file
names.
> use strict;
> use warnings;
> use File::Copy "cp";
>
> #For each file sent as an argument, check to see if
> #the first line is a shebang. If not, add one.
> foreach my $file (<>){
It is usually more advisable to use a while loop when reading from a filehandle.
> chomp($file);
> print "File name $file\n";
> unless ($file =~ /\.pl$/){
> print " Skipping $file -- not a .pl file.\n";
> next;
> }
>
> my $shebang = "#!/usr/bin/perl\n\n";
You don't really need to set this variable every loop iteration, just once at
the beginning of the program.
> open(HANDLE, $file);
You should *ALWAYS* verify that the file opened correctly.
> my $lineNum = 0;
Why not just use perl's built-in $. variable?
> while (<HANDLE>){
> $lineNum++;
> if ($lineNum == 1){
> if ($_ =~ /^#!/){
> print " Shebang exists.\n";
> last;
> }else{
> print " No shebang; creating.\n";
> open(TEMP, ">$file.tmp");
You should *ALWAYS* verify that the file opened correctly.
> print TEMP $shebang;
> }#check for shebang
> }else{
> print TEMP $_;
> }#if $lineNum == 1
> }# while (<HANDLE>)
> close(TEMP);
> close(HANDLE);
> unlink("$file.tmp") if cp("$file.tmp", $file);
> }#foreach $file
>
> ------------------------------------------------------------------------
> end script
> ------------------------------------------------------------------------
The same thing as a one-liner:
perl -i -pe'$.==1&&!/^#!/&&print"#!/usr/bin/perl\n";close ARGV if eof' *.pl
:-)
John
--
Perl isn't a toolbox, but a small machine shop where you can special-order
certain sorts of tools at low cost and in short order. -- Larry Wall
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>