Olivier Regnier wrote: > Giorgos Keramidas a écrit : >> On 2007-04-07 17:31, Olivier Regnier <[EMAIL PROTECTED]> 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 _______________________________________________ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"