Another approach, with a 'figure of merit':
>perl -wMstrict -le "use Text::LevenshteinXS qw(distance); ;;;; my $sample = 'A-E-H-L'; ;; my @options = qw( A-B-F-G-H-K-M A-E-G-H-L A-C-E-G-H-J-L B-F-H-K A-B-F-G-H-K-L C-H A-F-H H-A-F L-H-E-A A A-E X-A-X X-A-E-X L A-L X-A-L-X W-X-Y-Z Z Y-Z ); ;;;; my @interesting = $sample =~ m{ \w }xmsg; my $mask = join '', @interesting; my ($dull) = map qr{[^$_]}xms, join '', @interesting; my ($ordered) = map qr{$_?}xms, join '? ', @interesting; ;;;; for my $option (@options) { (my $primary = $option) =~ s{ $dull }{}xmsg; my ($sequence) = $primary =~ m{ ($ordered)? }xms; my $dist = distance $mask, $sequence; my $percent = 100 * (1 - ($dist / length $mask)); printf qq{%-16s -> %-6s -> %3.0f%% \n}, qq{'$option'}, qq{'$sequence'}, $percent; } " 'A-B-F-G-H-K-M' -> 'AH' -> 50% 'A-E-G-H-L' -> 'AEHL' -> 100% 'A-C-E-G-H-J-L' -> 'AEHL' -> 100% 'B-F-H-K' -> 'H' -> 25% 'A-B-F-G-H-K-L' -> 'AHL' -> 75% 'C-H' -> 'H' -> 25% 'A-F-H' -> 'AH' -> 50% 'H-A-F' -> 'H' -> 25% 'L-H-E-A' -> 'L' -> 25% 'A' -> 'A' -> 25% 'A-E' -> 'AE' -> 50% 'X-A-X' -> 'A' -> 25% 'X-A-E-X' -> 'AE' -> 50% 'L' -> 'L' -> 25% 'A-L' -> 'AL' -> 50% 'X-A-L-X' -> 'AL' -> 50% 'W-X-Y-Z' -> '' -> 0% 'Z' -> '' -> 0% 'Y-Z' -> '' -> 0%
In reply to Re: Pattern Matching with a Selected Sub-String
by AnomalousMonk
in thread Pattern Matching with a Selected Sub-String
by ozboomer
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |