script perl with sed command

Garrett Cooper youshi10 at u.washington.edu
Sun Apr 8 16:28:20 UTC 2007


Olivier Regnier wrote:
> Giorgos Keramidas a écrit :
>> On 2007-04-07 17:31, Olivier Regnier <oregnier at steelbox.org> wrote:
>>  
>>> Hello,
>>> I have a problem with my perl script with the command sed. Here is a
>>> example of my code:
>>>     
>>
>> Don't use system("sed ...") in Perl.  It's considered poor style, since
>> Perl can do the same without having to fork a shell/sed process.
>>
>>  
>>> # Selecting the fast server
>>> print "Using the server called $server";
>>> system(`/usr/bin/sed 's|\*default host=\(.*\)|\*default
>>> host=${server}|' $standard_supfile > $standard_supfile.copy`);
>>> system('/bin/mv $standard_supfile.copy $standard_supfile');
>>>     
>>
>> Try using Perl only, instead of forking sed(1), like this:
>>
>> ,-----------------------------------------------------------------------
>> |
>> | #!/usr/bin/perl -Tw
>> |
>> | use strict;
>> |
>> | #
>> | # supfile_set_default_host($supfile, $newhost)
>> | #       Set the default host used by the supfile $supfile to the
>> | #       host name supplied as $newhost.
>> | #
>> |
>> | sub supfile_set_default_host($$);
>> | sub supfile_set_default_host($$)
>> | {
>> |     my $tmpsupfile;
>> |     my $supfile = shift;
>> |     my $newhost = shift;
>> |
>> |     if (!defined($supfile) || !defined($newhost)) {
>> |         return undef;
>> |     }
>> |
>> |     $tmpsupfile = "tmp-" . $supfile;
>> |     open(SUP, "$supfile") or die "$!";
>> |     open(TMP, "> $tmpsupfile") or die "$!";
>> |
>> |     my $line;
>> |     while (defined($line = <SUP>)) {
>> |         chomp $line;
>> |         $line =~ s/^(\*[ \t]*default[ \t][ \t]*host[
>> \t]*=).*/$1${newhost}/;
>> |         print TMP "$line\n";
>> |     }
>> |     close(TMP) or die "$!";
>> |     close(SUP) or die "$!";
>> |     rename("$tmpsupfile", "$supfile") or die "$!";
>> |     return 1;
>> | }
>> |
>> | supfile_set_default_host('standard-supfile', 'cvsup.example.net');
>> |
>> `-----------------------------------------------------------------------
>>
>> This is slightly more complex than forking a sed(1) utility run, but
>> it's easier to understand (at least it is for me).
>>
>> A very brief run of the script seems to work here:
>>
>> ,-----------------------------------------------------------------------
>> |
>> | $ pwd
>> | /tmp
>> | $ cp /usr/share/examples/cvsup/standard-supfile .
>> | $ grep 'default host' standard-supfile
>> | *default host=CHANGE_THIS.FreeBSD.org
>> | $ perl -Tw supfile.pl
>> | $ grep 'default host' standard-supfile
>> | *default host=cvsup.keramida
>> | $
>> |
>> `-----------------------------------------------------------------------
>>
>> - Giorgos
>>
>>   
> Hello and thanks for this perl script. I'm new in perl and when i test
> him, i have an error that says:
> No such file or directory at myscript.pl line 18
> 
> line 18 = open(TMP, "> $tmpsupfile") or die "$!";
> 
> #!/usr/bin/perl -Tw
> 
> use strict;
> 
> #
> # supfile_set_default_host($supfile, $newhost)
> #       Set the default host used by the supfile $supfile to the
> #       host name supplied as $newhost.
> #
> 
> sub supfile_set_default_host($$);
> sub supfile_set_default_host($$)
> {
>     my $tmpsupfile;
>     my $supfile = "/etc/standard-supfile";
>     my $newhost = "cvsup.fr.freebsd.org";
> 
>     if (!defined($supfile) || !defined($newhost)) {
>         return undef;
>     }
> 
>     $tmpsupfile = "tmp-" . $supfile;
>     open(SUP, "$supfile") or die "$!";
>     open(TMP, "> $tmpsupfile") or die "$!";
> 
>     my $line;
>     while (defined($line = <SUP>)) {
>         chomp $line;
>         $line =~ s/^(\*[ \t]*default[ \t][ \t]*host[
> \t]*=).*/$1${newhost}/;
>         print TMP "$line\n";
>     }
>     close(TMP) or die "$!";
>     close(SUP) or die "$!";
>     rename("$tmpsupfile", "$supfile") or die "$!";
>     return 1;
> }
> 
> supfile_set_default_host('standard-supfile', 'cvsup.example.net');
> 
> 
> Thanks again for your help.

The file has to exist that you're trying to modify, otherwise it'll give
up :). Permissions issue?

Better to do that section may be:

     my $tmpsupfile;
     my $supfile = "/etc/standard-supfile";
     my $newhost = "cvsup.fr.freebsd.org";

     if (!defined($supfile) || !defined($newhost)) {
         return undef;
     }

     $tmpsupfile = new File::Temp();
     die "$!" unless(defined($tmpsupfile);
     open(SUP, "$supfile") or die "$!";


You need to add:

use File::Temp;

to the top of your script after "use strict;" though, and the Perl
module *should* be available with standard installations.

Cheers,
-Garrett


More information about the freebsd-questions mailing list