my $p2 = 'xyz'; # and use as
/([$p2])/ # --> /([xyz])/
总的来说你会得到
use warnings;
use strict;
use feature 'say';
my $text = shift // q(e z7);
my $p1 = 'a|e|o';
my $p2 = 'xyz';
$text =~ s/($p1)(\s)([$p2])([0-9])/replacement/g;
say $_ // 'undef' for $1, $2, $3, $4;
2条答案
按热度按时间ajsxfq5m1#
是的,模式中的变量被插入到模式中,在双引号的上下文中,你所显示的表达式是等价的。参见perlretut教程中的讨论。(我建议使用qr操作符。也参见perlretut中的讨论。)
但这种模式显然不对
((a|e|o))
呢?要么在变量中使用alternate,然后在正则表达式中捕获它或在变量中指示捕获,但在正则表达式中删除括号
捕获括号以任一种方式执行其工作,在这两种情况下,匹配项(
a
或e
或o
)都将捕获到表达式中的适当变量$1
中,因为这是第一次捕获[(x|y|z)]
匹配字符(
、x
、|
......(等等)--[...]
是字符类,它匹配其中的任一字符(少数字符有特殊含义)。或者使用字符类
总的来说你会得到
我添加了
\s
,而不是一个单空格,并且我用()
捕获了字符类匹配(问题中的模式没有),因为这似乎是需要的。7gcisfzg2#
这两个代码段都不是有效的Perl代码,因此它们是等效的,但只是在这两个代码段都不能编译的意义上。
但是假设你有一个有效的m//、s///或qr//操作符,那么是的,模式中的变量将按照你所描述的那样被处理。
例如,
相当于
正如在回答您之前的问题时所提到的,
(x|y|z)
肯定是一个bug,应该是xyz
。