Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在Perl正则表达式中使用操作?_Regex_Perl - Fatal编程技术网

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

Regex 如何在Perl正则表达式中使用操作?,regex,perl,Regex,Perl,例如,假设我有这样的东西: $_ = 23; $a = 2; print /$a $a+1/x; 应该打印1。基本上,可以在正则表达式字符串中使用函数吗 正则表达式中的变量插值与字符串中的变量插值工作原理几乎相同。给定my$x=2,字符串“$x$x+1”将是“2+1”。变量已展开,但字符串中的代码未执行 解决这个问题的一个技巧是在字符串中使用取消引用。这允许我们包含任意表达式,但语法有点麻烦。通常,我们创建一个数组引用,其值要包含[$x+1],然后立即取消引用:@{[$x+1]}。这类似

例如,假设我有这样的东西:

 $_ = 23;
 $a = 2;
 print /$a $a+1/x;

应该打印1。基本上,可以在正则表达式字符串中使用函数吗

正则表达式中的变量插值与字符串中的变量插值工作原理几乎相同。给定
my$x=2
,字符串
“$x$x+1”
将是
“2+1”
。变量已展开,但字符串中的代码未执行

解决这个问题的一个技巧是在字符串中使用取消引用。这允许我们包含任意表达式,但语法有点麻烦。通常,我们创建一个数组引用,其值要包含
[$x+1]
,然后立即取消引用:
@{[$x+1]}
。这类似于Ruby的
{…}
插值,或Bash
$(…)
命令替换

因此正则表达式
/$x@{[$x+1]}/x
可以工作

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

my $x = 2;
my $y = $x + 1;
/$x $y/x;

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

正则表达式中的变量插值工作原理与字符串中的变量插值基本相同。给定
my$x=2
,字符串
“$x$x+1”
将是
“2+1”
。变量已展开,但字符串中的代码未执行

解决这个问题的一个技巧是在字符串中使用取消引用。这允许我们包含任意表达式,但语法有点麻烦。通常,我们创建一个数组引用,其值要包含
[$x+1]
,然后立即取消引用:
@{[$x+1]}
。这类似于Ruby的
{…}
插值,或Bash
$(…)
命令替换

因此正则表达式
/$x@{[$x+1]}/x
可以工作

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

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

在匹配操作符
m/
或替换操作符的匹配部分
s///
中提供了代码执行

它的版本取代了代码的返回,并继续将其视为一种模式

/(??{ code })/
那么你的情况呢

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

匹配并捕获
23

这里特别允许这样做,通常出于安全原因不允许这样做

这是一个非常复杂的功能,带有复杂的警告。除了上面链接中的条目外,还可以按照该文本中的链接阅读

请不要为了方便使用这个复杂的工具,也不要用它来代替正确编写的代码

在匹配运算符
m/
或替换运算符的匹配部分
s//
中提供了代码执行功能

它的版本取代了代码的返回,并继续将其视为一种模式

/(??{ code })/
那么你的情况呢

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

匹配并捕获
23

这里特别允许这样做,通常出于安全原因不允许这样做

这是一个非常复杂的功能,带有复杂的警告。除了上面链接中的条目外,还可以按照该文本中的链接阅读


请不要为了方便使用这个复杂的工具,也不要用它来代替正确编写的代码

从你的例子很难知道为什么你不在regexit之外做这个操作从你的例子很难知道为什么你不在regex之外做这个操作