http://qs321.pair.com?node_id=151366


in reply to Re: Re: question about perl
in thread How do I change the shebang line for all perl scripts in a directory

Yeah, I know about the "anywhere in the script" thingy, but
perl -pi.bak -e 's[^#!/usr/local/bin/perl][#!/usr/bin/perl]' *.pl
yields a "/usr/local/bin/perl][: Event not found." error on my Perl 5.6.1 system, which is why I didn't post my original answer with an anchor metacharacter. Don't really know why the "^#!" is freaking out the regex, but on further examination it looks like the ! has to be escaped. I've corrected the code in my original post to compensate.

And all of this:

perl -pi.bak -e 'BEGIN{$c=@ARGV};s[^#!/usr/local/bin/perl][#!/usr/bin/ +perl] && $c-- if $c> @ARGV' *.pl
can replaced with this:
perl -pi.bak -e 'BEGIN{undef $/};s[^#\!/usr/local/bin/perl][#\!/usr/bi +n/perl]' *.pl
...which at least saves some typing, and is a bit more understandable besides. :-D

Gary Blackburn
Trained Killer

Update: The exclamation mark needs escaping because I'm using tcsh, a csh-style shell. Anyone using a different type of shell (such as bash or other Bourne-type shell) shouldn't have to escape the ! at all. What a pain in the butt... :-(

Replies are listed 'Best First'.
Re: Re: Re: Re: question about perl
by rnahi (Curate) on Mar 13, 2002 at 14:00 UTC
    This is my output from Deparse in both Perl 5.6.0 and 5.6.1
    perl -MO=Deparse -pi.bak -e "s[^#!/usr/local/bin/perl][#!/usr/bin/perl +]" LINE: while (defined($_ = <ARGV>)) { s[^#!/usr/local/bin/perl][#!/usr/bin/perl]; } continue { print $_; } -e syntax OK
    There was no need for escaping the "!" and it worked fine (I searched perlre about the need for escaping the bang, but I couldn't find it. Did I miss something?).
    So I couldn't replicate your error condition. Sorry.
    However, I agree that your script is more readable. :)