Re: script perl with sed command
On 2007-04-08 00:26, Garrett Cooper <[EMAIL PROTECTED]> wrote: > Giorgos Keramidas wrote: > > Try using Perl only, instead of forking sed(1), like this: > > [...] > > | sub supfile_set_default_host($$); > > | sub supfile_set_default_host($$) > > | { [...] > Interesting. Is that old perl syntax (v4, etc)? Just curious because > most of the documentation and examples switched to: > > sub supfile_set_default_host > { > > syntax as opposed to: > > sub supfile_set_default_host($$); > > sub supfile_set_default_host($$); > { That's actually a function prototype. Prototypes are explained in: man perlsub in far more detail than I could ever describe in an email message :) HTH, Giorgos ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: script perl with sed command
On 2007-04-08 09:28, Garrett Cooper <[EMAIL PROTECTED]> wrote: > Olivier Regnier wrote: > 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 "$!"; Ah, much better, thanks :) ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: script perl with sed command
On 2007-04-08 11:40, Olivier Regnier <[EMAIL PROTECTED]> wrote: > Giorgos Keramidas a ?crit : > >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 = )) { > >| 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'); > >| > >`--- > [...] > > 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 "$!"; Line 18 is not an open command, so something odd is happenning when you copy/paste the script from your mailer. Try downloading a copy of teh script from: http://people.freebsd.org/~keramida/files/supfile.perl ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: script perl with sed command
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 = )) { >> | 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 = )) { > 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]"
Re: script perl with sed command
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 = )) { | 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 = )) { 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. ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: script perl with sed command
Interesting. Is that old perl syntax (v4, etc)? Just curious because most of the documentation and examples switched to: No, he's using a function prototype. In this particular case, he's saying the supfile_set_default_host function will take two scalars as arguments. For more info: perldoc perlsub Josh ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: script perl with sed command
Giorgos Keramidas wrote: > 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 = )) { > | 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 Interesting. Is that old perl syntax (v4, etc)? Just curious because most of the documentation and examples switched to: sub supfile_set_default_host { syntax as opposed to: sub supfile_set_default_host($$); sub supfile_set_default_host($$); { partly for abbreviation's sake and because I think they moved the meaning of $$ to the running PID of the script, correct? I'm rather new to the Perl game though to be honest (been playing around with Perl for only the past 3 years -- and in particular over the past 2~3 months), so my take on the language could be off. Thanks for the history lesson in advance :), -Garrett ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: script perl with sed command
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 = )) { | 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 ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: script perl with sed command
Olivier Regnier wrote: Hello, I have a problem with my perl script with the command sed. Here is a example of my code: # 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'); But in console i have this message: sed: 1: "s|*default host=(.*)|*d ...": unescaped newline inside subsitute pattern Can you help me please ? Thank you :) You forgot "chomp $server;" All commands with backticks ('`') have newlines inserted after them. There should only be one reference to "*default host=" though, so why are you going through the trouble of using sed? This can be done inline with perl as well. -Garrett ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: script perl with sed command
Warren Block a écrit : On Sat, 7 Apr 2007, Olivier Regnier wrote: I have a problem with my perl script with the command sed. Here is a example of my code: # 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'); But in console i have this message: sed: 1: "s|*default host=(.*)|*d ...": unescaped newline inside subsitute pattern Most likely there is a newline at the end of $server because it was output from backticks. To fix that, you'd use chomp: chomp(my $server = `fastest_csvsup -Q -c us`); Just a general note: Perl's s/ command does more than sed's, with less hassle, and you wouldn't have to mess with shell escapes. -Warren Block * Rapid City, South Dakota USA ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]" Ok thank you for your answer. The script work well. ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"
Re: script perl with sed command
On Sat, 7 Apr 2007, Olivier Regnier wrote: I have a problem with my perl script with the command sed. Here is a example of my code: # 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'); But in console i have this message: sed: 1: "s|*default host=(.*)|*d ...": unescaped newline inside subsitute pattern Most likely there is a newline at the end of $server because it was output from backticks. To fix that, you'd use chomp: chomp(my $server = `fastest_csvsup -Q -c us`); Just a general note: Perl's s/ command does more than sed's, with less hassle, and you wouldn't have to mess with shell escapes. -Warren Block * Rapid City, South Dakota USA ___ freebsd-questions@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"