Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Answer: How do I replace a substring (if exists) with a different substring in a string?

( #98499=categorized answer: print w/ replies, xml ) Need Help??

Q&A > strings > How do I replace a substring (if exists) with a different substring in a string? contributed by dkubb

You can use substr, length, and index inside a while loop to do what you want:

my $string = '01234567890'; my $find = '0'; my $replace = 'a'; my $pos = index($string, $find); while ( $pos > -1 ) { substr( $string, $pos, $length( $find ), $replace ); $pos = index( $string, $find, $pos + length( $replace )); }

Benchmarked, this is about 15-20% faster than a s///g regex.

IMHO, unless blazing speed is really important, you can't beat the following for readability:

  $string =~ s/\Q$find\E/$replace/g;

Comment on Answer: How do I replace a substring (if exists) with a different substring in a string?
Select or Download Code
(dkubb) Re: (3) Answer: How do I replace a substring (if exists) with a different substring in a string?
by dkubb (Deacon) on Jul 22, 2001 at 02:00 UTC

    Note: I found a bug in my earlier answer, since I can't edit it, I am posting this follow up. If the string to replace has the substring you are trying to find, it can get into an endless loop. Here is an updated ansewer:

    my $string = '01234567890'; my $find = '0'; my $replace = 'a'; my $pos = index($string, $find); while($pos > -1) { substr($string, $pos, length($find), $replace); $pos = index($string, $find, $pos + length($replace)); }

    In this case, an s/// regex is actually 5% faster.

Log In?
Username:
Password:

What's my password?
Create A New User
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (3)
As of 2015-07-05 23:54 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 (68 votes), past polls