如何在Perl正则表达式中使用操作?

例如,让我们说我有这样的事情:如何在Perl正则表达式中使用操作?

$_ = 23; 

$a = 2;

print /$a $a+1/x;

应打印1.基本上,是它可以使用正则表达式的字符串中的功能呢?

回答:

正则表达式中的变量插值与字符串中的变量插值几乎相同。给定​​,字符串​​将是"2 2+1"。该变量已展开,但字符串中的代码未执行。

围绕这个的一个诀窍是在字符串中使用解引用引用。这使我们可以包含任意表达式,但语法有点麻烦。通常,我们用我们想包含的值创建一个数组引用,然后立即解引用它:@{[$x + 1]}。这与Ruby的#{...}插值或Bash $(...)命令替换类似。

所以正则表达式/$x @{[$x + 1]}/x会工作。

但在大多数情况下,这将更加清晰进行正则表达式之外的所有计算:

my $x = 2; 

my $y = $x + 1;

/$x $y/x;

Perl的正则表达式的语法也有语法,可以动态地生成正则表达式的部分。使用上面的变量插值,插值变量内容,然后编译正则表达式。但高级正则表达式可能会在模式匹配期间更改变量的值。这些延迟的正则表达式可以用(??{ ... })语法编写。这里:/$x (??{ $x + 1 })/x。但是,这是一个非常先进且容易出错的正则表达式特性。这也会比普通的正则表达式慢。

回答:

有an extended pattern,它提供了在匹配运算符m/或替换运算符s///的匹配部分中的代码执行。

它的版本替换代码的回报,接着把它当作一种模式是

/(??{ code })/ 

所以你的情况

$_ = 23; 

my $x = 2;

my ($m) = /(2(??{ $x+1 }))/;

say $m;

RE_EVAL: { 

use re 'eval';

my ($m) = /($x(??{ $x+1 }))/;

say $m;

}

比赛和捕获23

这里use re 'eval'明确允许这一点,通常由于安全原因不允许。

这是一个非常复杂的功能,它带有复杂的警告。除了在上述链接中的输入外,还请按照该文本中的链接阅读有关Embedded Code Execution frequency。

请不要使用这个复杂的工具,以方便或代替正确书写的代码。

以上是 如何在Perl正则表达式中使用操作? 的全部内容, 来源链接: utcz.com/qa/262375.html

回到顶部