Вы задаете интересный вопрос, но когда я отправился искать такую вещь (например, в List::MoreUtils
), я продолжал возвращаться к тому, как это отличается от grep
.Итак, вот моя базовая реализация, основанная на grep
.Если вы не против поиска по всему списку или хотите найти все совпадения, вот пример:
#!/usr/bin/perl
use strict;
use warnings;
my @prefixes = qw/ pre1 pre2 pre3 /;
my $test = 'pre1fixed';
my @found = grep { $test =~ /^$_/ } @prefixes;
print "$_ is a prefix of $test\n" for @found;
Я также думаю, что должен быть какой-то способ использования оператора умного совпадения ~~
сделать это в коротком замыкании.Кроме того, как указывает инструмент, для этого тоже можно использовать функцию List::Util
.Это останавливает поиск после того, как совпадение найдено.
#!/usr/bin/perl
use strict;
use warnings;
use List::Util qw/first/;
my @prefixes = qw/ pre1 pre2 pre3 /;
my $test = 'pre1fixed';
my $found = first { $test =~ /^$_/ } @prefixes;
print "$found is the prefix of $test\n";
Единственный известный мне алгоритм - это Aho-Corasick , хотя я оставлю это в качестве упражнения для читателя (т.е.Я не знаю) чтобы увидеть, поможет ли это вам.Я вижу, что есть модуль (Algorithm::AhoCorasick
).Я также считаю, что где-то читал, что структуры this и trie реализованы в сопоставлении Perl при определенных обстоятельствах.Возможно, кто-то знает, где я это прочитал?Редактировать: нашел в ТАК вопрос о соответствующих альтернативах