Always curious, I wondered if the apparently complex lookahead logic proposed by
ikegami and
happy.barney would actually save time over your original approach, ignoring, as we should not, that your original approach made some bold assumptions about where the final underscore would appear.
I factored out the final uppercasing to make the code more nearly comparable, and came up with
use Benchmark('countit');
$code = '$str =~ s/(?<=[a-z])(?=[A-Z])/_/g';
$t = countit(5, '$str="BuyACaseOfCamels";' . $code);
$count = $t->iters ;
print "$count loops of $code\n";
$code = '$str =~ s/([a-z]+)(?=(.?))/ $1 . (length($2) ? "_" : "") /ge'
+;
$t = countit(5, '$str="BuyACaseOfCamels";' . $code);
$count = $t->iters ;
print "$count loops of $code\n";
$code = '$str =~ s/([a-z]+)/$1_/g; $str =~ s/_$//';
$t = countit(5, '$str="BuyACaseOfCamels";' . $code);
$count = $t->iters ;
print "$count loops of $code\n";
I was a bit surprised at the results.
perl ccase.pl
1686588 loops of $str =~ s/(?<=[a-z])(?=[A-Z])/_/g
1194666 loops of $str =~ s/([a-z]+)(?=(.?))/ $1 . (length($2) ? "_" :
+"") /ge
1520477 loops of $str =~ s/([a-z]+)/$1_/g; $str =~ s/_$//
perl ccase.pl
1793776 loops of $str =~ s/(?<=[a-z])(?=[A-Z])/_/g
1286561 loops of $str =~ s/([a-z]+)(?=(.?))/ $1 . (length($2) ? "_" :
+"") /ge
1466174 loops of $str =~ s/([a-z]+)/$1_/g; $str =~ s/_$//
perl ccase.pl
1760558 loops of $str =~ s/(?<=[a-z])(?=[A-Z])/_/g
1336044 loops of $str =~ s/([a-z]+)(?=(.?))/ $1 . (length($2) ? "_" :
+"") /ge
1492832 loops of $str =~ s/([a-z]+)/$1_/g; $str =~ s/_$//
Over three runs, the counts varied slightly, but
happy.barney's code consistently outperformed your original code, and
ikegami's code was only slightly less peppy than yours, a fair tradeoff for doing a better job of trimming the final underscore. I, for one, am impressed at how well the regular expression engine can perform.
-
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.