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 = 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 ___ 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 = 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 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
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 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. ___ 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 = 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]
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 = 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'); | `--- [...] 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
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 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]
script perl with sed command
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 :) ___ 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]
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
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]