如何从Perl匹配运算符中将匹配提取到变量中?

joa*_*him 15 perl

如果我有匹配运算符,如何将括号中捕获的字符串部分保存在变量中而不是使用$1,$2等等?

... = m/stuff (.*) stuff/;
Run Code Online (Sandbox Code Playgroud)

左边的是什么?

joa*_*him 34

诀窍是通过使用列表赋值使m //在列表上下文中工作:

 ($interesting) = $string =~ m/(interesting)/g;
Run Code Online (Sandbox Code Playgroud)

这可以整齐地扩展到抓住更多的东西,例如:

 ($interesting, $alsogood) = $string =~ m/(interesting) boring (alsogood)/g;
Run Code Online (Sandbox Code Playgroud)


inn*_*naM 8

使用包围构造(...)来创建捕获缓冲区.然后使用特殊的变量$1,$2等来访问捕获的字符串.

if ( m/(interesting)/ ) {
    my $captured = $1;
}
Run Code Online (Sandbox Code Playgroud)

  • @Peter:我认为你必须将$ 0(当前程序的名称)与其他东西混淆. (5认同)
  • 其他东西是$&(使用它对整个程序有性能影响) (2认同)

And*_*ler 5

通常,您还需要进行测试以确保输入字符串与您的正则表达式匹配。这样,您还可以处理错误情况。

要提取有趣的东西,您还需要某种方式来锚定您对提取感兴趣的位。

因此,在您的示例中,这将首先确保输入字符串与我们的表达式匹配,然后提取两个“无聊”位之间的位:

$input = "boring interesting boring";
if($input =~ m/boring (.*) boring/) {
    print "The interesting bit is $1\n";
}
else {
    print "Input not correctly formatted\n";
}
Run Code Online (Sandbox Code Playgroud)