script perl with sed command

Olivier Regnier oregnier at steelbox.org
Sun Apr 8 09:40:17 UTC 2007


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.


More information about the freebsd-questions mailing list