!/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); }