!/usr/bin/env perl
use 5.014;
use warnings;
use Benchmark 'cmpthese';
my @data = (
'XX', 'XY', 'XX', 'XY',
'XX', 'XY',
'XX', 'XY',
'XX', 'XY',
'XXXXXX',
'XXXXXY',
);
if (@ARGV && $ARGV[0] eq 'bench') {
cmpthese 0 => {
orig => sub { run_comp(\&compare, 1) },
kens => sub { run_comp(\&kens_cmp, 1) },
};
}
else {
say '*** Original ***';
say '-' x 60;
sub { run_comp(\&compare) }->();
say '*** Ken\'s ***';
say '-' x 60;
sub { run_comp(\&kens_cmp) }->();
}
sub run_comp {
my ($cmp_func, $bench) = @_;
for my $d1 (@data) {
for my $d2 (@data) {
if (defined $bench) {
$cmp_func->($d1, $d2);
}
else {
say "'$d1' and '$d2': ",
$cmp_func->($d1, $d2) ? "SAME" : "DIFFER";
}
}
}
}
sub compare {
# We ignore the standalone, opening and closing tags , , ,
my $cString1 = $_[0];
my $cString2 = $_[1];
$cString1 =~ s/\/?<(bpt|ept|ph|i)[^<>]*>//gsmi;
$cString2 =~ s/\/?<(bpt|ept|ph|i)[^<>]*>//gsmi;
("$cString1" eq "$cString2") ? return 1 : return 0;
}
sub kens_cmp {
state $stripped;
($stripped->{$_[0]} //= $_[0] =~ s/<(?:i|ph|bpt|ept) [^>]*?>//gr)
eq
($stripped->{$_[1]} //= $_[1] =~ s/<(?:i|ph|bpt|ept) [^>]*?>//gr);
}