Another way:
my $nth = 3;
my $rep = 1;
my $chr = 'e';
my $str = "Terence and Philip are sweet\n";
my $pos = 0;
$pos = index($str, $chr, $pos+1) for(1..$nth);
substr($str, $pos) =~ s/$chr/$rep/g;
print $str;
You could, of course, move the $pos finding part into a do block within the substr expression but it's a bit unwieldy.
Update: Well, my method's a little bit more wordy then quent's but it's ever-so-slightly faster, almost definately because it avoids doing the string-eval. I don't think it's a significant difference, though. I was just curious. :-)
my $s = "Terence and Philip are sweet\n";
my $c = 'e';
my $r = 1;
my $n = 3;
sub mine {
my ($str, $chr, $rep, $nth) = @_;
my $pos = 0;
$pos = index($str, $chr, $pos+1) for(1..$nth);
substr($str, $pos) =~ s/$chr/$rep/g;
return $str;
}
sub quents {
my ($str, $chr, $rep, $nth) = @_;
my $i = 1;
$str =~ s/($chr)/$i++<$nth?$1:$rep/eg;
return $str;
}
use Benchmark qw( timethese cmpthese );
cmpthese(500000, {
"Mine" => sub { mine ($s, $c, $r, $n) },
"Quent's" => sub { quents ($s, $c, $r, $n) },
});
__END__
Benchmark: timing 500000 iterations of Mine, Quent's...
Mine: 14 wallclock secs (14.08 usr + 0.00 sys = 14.08 CPU) @ 35
+511.36/s (n=500000)
Quent's: 19 wallclock secs (18.58 usr + 0.03 sys = 18.61 CPU) @ 26
+867.28/s (n=500000)
Rate Quent's Mine
Quent's 26867/s -- -24%
Mine 35511/s 32% --
bbfu
Seasons don't fear The Reaper.
Nor do the wind, the sun, and the rain.
We can be like they are.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.