Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re: Can you teach a new dog an old trick?

by bikeNomad (Priest)
on Jul 28, 2001 at 20:40 UTC ( #100568=note: print w/ replies, xml ) Need Help??


in reply to Can you teach a new dog an old trick?

It's such a common idiom that the -p and -i command-line flags were invented to deal with it:

#!/usr/bin/perl -wpi s/string1/string2/g;

And then you'd run it as: myScript *.htm

update: note that the contents of a script run with -p or -n are inside a loop. If you want to initialize anything before the loop, use a BEGIN or INIT block.


Comment on Re: Can you teach a new dog an old trick?
Select or Download Code
Replies are listed 'Best First'.
Re: Re: Can you teach a new dog an old trick?
by PetaMem (Priest) on Jul 29, 2001 at 12:43 UTC
    This is not good...

    I tried to extend it to:

    #!/usr/bin/perl -wpi my $src = shift; my $dst = shift; s/$src/$dst/g;
    and it throws many many messages on me:
    Use of uninitialized value in substitution (s///) at /home/rj/bin/repl +ace line 4, <> line 38. Use of uninitialized value in regexp compilation at /home/rj/bin/repla +ce line 4, <> line 39. Use of uninitialized value in substitution (s///) at /home/rj/bin/repl +ace line 4, <> line 39. Use of uninitialized value in regexp compilation at /home/rj/bin/repla +ce line 4,
    (called "replace hallo hello tmp.txt")
    Then I looked at man perl what this switch -p does
    ok it was not there, so I looked at man perlrun and
    then I found the error (it tries to get $src and $dst in every
    loop. Well, Im using my old replace script now again...
    #!/usr/bin/perl my $src = shift; my $dst = shift; print "Replace >$src< with >$dst<.\n"; $dst =~ s/\\n/\n/g; $dst =~ s/\\t/\t/g; foreach $file (@ARGV) { my $file2 = "/tmp/$file.".$$; print "replacing in File: $file...\n"; print "$file2\n"; open HANDLE, $file or die "$file: $!"; while(<HANDLE>) { $zeile .= $_; # Zeile von Datei einlesen } close HANDLE; $zeile =~ s/$src/$dst/gs; open HANDLE, ">$file2"; print HANDLE $zeile; close HANDLE; $zeile = ''; system("mv $file2 $file"); }
    Its ugly and unelegant and made 1996, but it works. :-)

    Ciao

      You need to use a BEGIN block, like so:

      #!/usr/bin/perl -wpi BEGIN { ($src,$dst)=(@ARGV); } s/$src/$dst/g;

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://100568]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (11)
As of 2015-07-29 12:34 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (263 votes), past polls