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

时间:2009-11-02 13:07:23

标签: perl

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

... = m/stuff (.*) stuff/;

左边是什么?

6 个答案:

答案 0 :(得分:33)

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

 ($interesting) = $string =~ m/(interesting)/g;

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

 ($interesting, $alsogood) = $string =~ m/(interesting) boring (alsogood)/g;

答案 1 :(得分:8)

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

if ( m/(interesting)/ ) {
    my $captured = $1;
}

答案 2 :(得分:4)

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

要提取有趣的东西,你还需要有一些方法来锚定你有兴趣提取的位。

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

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

答案 3 :(得分:2)

您可以使用命名捕获缓冲区:

if (/ (?<key> .+? ) \s* : \s* (?<value> .+ ) /x) { 
    $hash{$+{key}} = $+{value};
}

答案 4 :(得分:2)

@strings位于左侧并包含结果,然后输入您的输入字符串$input_string。不要忘记标记g以匹配所有子字符串。

my @strings=$input_string=~m/stuff (.*) stuff/g;

答案 5 :(得分:0)

  

$&amp; - 与上一个匹配的字符串   成功的模式匹配(不计算在内   任何隐藏在BLOCK或   由当前BLOCK包围的eval()。

#! /usr/bin/perl

use strict;
use warnings;

my $interesting;
my $string = "boring interesting boring";
$interesting = $& if $string =~ /interesting/;