Я пытаюсь константы перегрузки в регулярных выражениях. Вот мой пакет Tagger:
package Tagger;
use overload;
sub import { overload::constant 'qr' => \&convert }
sub convert {
my $re = shift;
$re =~ s/\\nom/((?:[A-Z]{1}[a-z]+\\s*){2,3}(\\((\\w|\\s)+\\)+?)*)/xg;
return $re;
}
1;
Вот подпрограмма, в которой я хотел бы вызвать перегрузку:
sub ChopPattern {
my $string= shift;
my $pattern = shift;
if($string =~ m/$pattern/) {
$string =~ s/$&/ /g;
return ($string, $&);
} else {
return ($string, '');
}
}
Вот мой тест:
$test = "foo bar Max Fast bar foo";
($test, $name) = ChopPattern($test, '\nom');
say $test;
say $name;
Если я проведу тестовый шаблон, \nom
в подпрограмме:
sub ChopPattern {
my $string= shift;
my $pattern = shift;
if($string =~ m/\nom/) {
$string =~ s/$&/ /g;
return ($string, $&);
} else {
return ($string, '');
}
}
тест дает правильный ответ:
foo bar bar foo
Max Fast
Но если я использую $pattern
в матче, как указано выше, результат теста:
foo bar Max Fast bar foo
<null line>
Есть ли причина, по которой \nom
запускает Tagger, но переменная, равная \nom
, не работает?
Ниже приведены детали используемой версии Perl:
This is perl 5, version 16, subversion 3 (v5.16.3) built for MSWin32-x64-multi-thread (with 1 registered patch, see perl -V for more detail)
Copyright 1987-2012, Larry Wall
Binary build 1604 [298023] provided by ActiveState http://www.ActiveState.com
Built Apr 14 2014 15:29:45