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