Как я могу интерполировать переменную в регулярное выражение Perl 6?
В обзоре 05 упоминается, что Perl 6 не интерполирует переменные в регулярное выражение, но вы можете связать внешнюю переменную с шаблоном. Документы не упоминают эту функцию, насколько я могу судить. Я думаю, что люди все еще хотят как-то создать шаблон из строки, поэтому мне интересно, как это будет работать.
Вот программа, которая демонстрирует, что происходит сейчас. Я не знаю, должно ли это случиться или что-то предполагалось. Я вставляю переменную в шаблон. Если вы посмотрите на$r
с.perl
, вы видите имя переменной. Затем я применяю шаблон, и он соответствует. Я изменяю значение переменной. Теперь шаблон не совпадает. Замените его на что-то еще, что будет работать, и снова совпадет
my $target = 'abcdef';
my $n = 'abc';
my $r = rx/ ( <$n> ) /;
# the smart match like this doesn't return a Match object
# https://rt.perl.org/Ticket/Display.html?id=126969
put 'rx// directly: ',
$target ~~ $r
?? "Matched $0" !! 'Misssed';
# now, change $n. The same $r won't match.
$n = 'xyz';
put 'rx// directly: ',
$target ~~ $r
?? "Matched $0" !! 'Misssed';
# now, change back $n. The same $r does match.
$n = 'ab';
put 'rx// directly: ',
$target ~~ $r
?? "Matched $0" !! 'Misssed';
Если это то, что он должен делать, хорошо. Документы здесь легкие, а тесты (де-факто spec) не сложны для такого поведения на большом расстоянии.
Я мог бы сделать дополнительную работу, чтобы закрыть копию (и, возможно, больше работы, чем я показываю в зависимости от того,$n
), который я нахожу неумело:
my $r = do {
my $m = $n;
rx/ <$m> /;
};
Но я все еще хотел бы иметь способ «доработать» шаблон (о боже, я только что попросил/o
возвращаться). Метод вRegex
возможно. Я думаю, что люди будут искать эту функцию.
my $r = rx/ .... /.finalize; # I wish!
Или, Perl 6 имеет гораздо лучший способ сделать такие вещи, и я просто полон старой школы мышления. В Perl 6 вместо правил есть правила. За всем этим стоит парсер. Я думал, что определениеtoken
или жеrule
может быть, путь, но я думаю, что столкнулся с той же проблемой. Я не вижу, что такое иметь подчиненную фабрику.
Есть ли другой способ сделать это?