Один из способов построения регулярного выражения - это чередование возможных версий строк.Я думаю, что это также должно распространиться на более общие области применения
use warnings;
use strict;
use feature 'say';
my $target = shift || 'hello';
my @strings = (
"Test 1 hello",
"Something else",
"Test 2 hell",
"And also he",
"Test 4 hel"
);
my $re_versions = build_regex($target);
foreach my $string (@strings)
{
if ($string =~ /($re_versions)$/)
{
say "'$string' --> $1";
}
};
sub build_regex {
my ($s) = @_;
my @versions;
while ($s) {
push @versions, quotemeta $s;
chop $s;
}
return join '|', @versions;
}
Это не короче (хотя, конечно, можно записать более коротким способом), но оно должно быть управляемым для уточненийв допустимых версиях строки, порядке сопоставления и т. д.
Если есть причина, по которой вам нужно вернуть скомпилированное регулярное выражение, измените функцию return на
my $re_str = join '|', @versions;
return qr/$re_str/;
, где теперь можно также добавлять флагиэто может подойти.