Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"
 
PerlMonks  

search and replace with a temp file at a certain substr position

by drock (Beadle)
on Jul 20, 2005 at 19:19 UTC ( [id://476594]=perlquestion: print w/replies, xml ) Need Help??

drock has asked for the wisdom of the Perl Monks concerning the following question:

All, I need to search a file for a string then set a variable using substr b/c it is at a certain position, then finally replace the string with another string. Thank you, Here is my test code:
my $gpg=qq(/home/gpghrp/.gnupg); open (GPG, "gpg --fingerprint |") or die "unable to open pipe sys call + (1)... Broken? $!"; open(OLD,"+<$gpg/scripts/gpg_encr.saved") or die $!; open(NEW, "+<$gpg/scripts/gpg_encr.saved.new") or die $! for (;<OLD>;) { if ( /(?)readonly tlx=/ ) { my $ns =substr($_,13,8) print "Now substituting\n"; print NEW s/$ns/"blah"/; } } close (GPG); close (SYS);

Replies are listed 'Best First'.
Re: search and replace with a temp file at a certain substr position
by ikegami (Patriarch) on Jul 20, 2005 at 19:34 UTC
    my $gpg = '/home/gpghrp/.gnupg'; my $file = "$gpg/scripts/gpg_encr.saved"; my $temp = "$file.new"; open(OLD, '<', $file) or die "Can't open $file: $!\n"; open(NEW, '>', $temp) or die "Can't create $temp: $!\n"; while (<OLD>) { # Faster than regexp for plain text. if (index($_, '(?)readonly tlx=') >= 0) { substr($_, 13, 8, "blah"); } print NEW $_; } close(NEW); close(OLD); rename($temp, $file) or die "Can't update $file: $!\n";

    or as a one-liner:

    perl -i -pe '/\Q(?)readonly tlx=\E/ && substr($_,13,8,"blah");' /home/ +gpghrp/.gnupg/scripts/gpg_encr.saved
Re: search and replace with a temp file at a certain substr position
by jdporter (Paladin) on Jul 20, 2005 at 20:21 UTC
    It sounds like you may have some other issues, but one thing you should definitely be aware of is that s/// does not return the modified string! So instead of
    print NEW s/$ns/"blah"/;
    you should do
    s/$ns/"blah"/; print NEW $_;
Re: search and replace with a temp file at a certain substr position
by Zaxo (Archbishop) on Jul 20, 2005 at 19:35 UTC

    Substr can do the replacing for you:         my $ns = substr( $_, 13, 8, 'blah'); but it appears that you aren't printing what you want to *NEW,         print NEW $_;

    I don't understand your regex. What is it supposed to match?

    After Compline,
    Zaxo

      the string I am searching on is like readonly strlinehlth=343434 readonly anthem=454545 readonly tlx=34435432 I used the substr thanks it worked! But now I am trying to improve my code b/c I realized I am making 3 identical system calls. My thought is create a routine with LABLES for each condition like so. Is there a better way or why isn't this working?
      sub finger { open (GPG, "gpg --fingerprint |") or die "unable to open pipe sys call + (1)... Broken? $!"; for (;<GPG>;) { { EXP: if ( /(?i)expires/ ) { y<-]>//d; $expdate = +(split)[4]; print $expdate,"\n"; } FPR: if (/talx/ig .. /expire/ig) { if (/key/i) { y<[Key,fingerprint,=]>//d; y{ }//d; print FPR $_; print "Now deleting key\n"; # call; last; } } KEY: if ( /(?i)pub/ and /(?i)talx/) { $keyid = (substr ($_,11,9)); } } # END FOR LOOP close (GPG) or die "unable to close pipe sys call (0)... Broken? $!"; } # END ROUTINE &finger(goto EXP);

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://476594]
Approved by ghenry
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chilling in the Monastery: (3)
As of 2024-03-29 06:08 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found