note
kcott
<p>G'day [id://648867|BernieC],</p>
<p>
I would have used [https://perldoc.perl.org/functions/index|index] for this
(rather than the [id://11140480|previously suggested] [https://perldoc.perl.org/functions/substr|substr]).
</p>
<p>
With <c>index</c>, you are doing exactly what you show in your spec: is the character at a certain position the one you want.
With <c>substr</c>, you are extracting a character at a certain position, and then performing a comparison operation.
</p>
<p>
The amount of coding for both is the same:
</p>
<code>
$ perl -E '
my @x = qw{ABC DEF BXB};
my ($i, $c) = qw{1 B};
for (@x) {
say "$_: ", $i == index($_, $c, $i) ? "YES" : "NO";
say "$_: ", $c eq substr($_, $i, 1) ? "YES" : "NO";
}
'
ABC: YES
ABC: YES
DEF: NO
DEF: NO
BXB: NO
BXB: NO
</code>
<p>
A [https://perldoc.perl.org/Benchmark|Benchmark] indicated that <c>index</c> was roughly twice as fast as <c>substr</c>.
I used much the same code as I showed above:
</p>
<code>
#!/usr/bin/env perl
use strict;
use warnings;
use Benchmark 'cmpthese';
my @x = qw{ABC DEF BXB};
my ($i, $c) = qw{1 B};
cmpthese 0 => {
index => sub { $i == index($_, $c, $i) ? 1 : 0 for @x },
substr => sub { $c eq substr($_, $i, 1) ? 1 : 0 for @x },
};
</code>
<p>
I ran this three times. All results were very close. The middle was:
</p>
<code>
Rate substr index
substr 3981142/s -- -46%
index 7383385/s 85% --
</code>
<p></p>
<!-- Node text goes above. Div tags should contain sig only -->
<div class="pmsig"><div class="pmsig-861371">
<p>— Ken</p>
</div></div>
11140479
11140479