2009-04-08 94 views
1

我有一个包含正则表达式的散列:要在其中捕获的匹配数和变量以及它们的匹配位置。例如:在Perl中使用正则表达式的匹配元素

my %hash = (
    reg_ex => 'Variable1:\s+(.*?)\s+\n\s+Variable2:\s+(.*?)\s+\n', 
    count => 2, 
    Variable1 => 1, 
    Variable2 => 2, 
); 

我会在代码的其他部分,我会只给说$to_be_matched_variable =~ /$hash{reg_ex}/使用这个表达式,我们在$1$2这里获得所需要的匹配,...

我需要使用密钥Variable1的值,它表示在我们通常使用的地方使用的匹配数$1。我试过$.$hash{Variable1}$,$hash{Variable1}。我无法找到如何框架的东西,将相当于$1$2 ...

+1

这闻起来像别的东西是不对您的架构。你想完成什么任务? – 2009-04-08 15:28:49

+0

我建议有reg_ex => qr /.../,所以整个事情有点更清楚(IMO) – Tanktalus 2009-04-15 21:10:18

回答

7

尝试:

(my @ArrayOfMatches) = $to_be_matched_variable =~ /$hash{reg_ex}/; 

my $Variable1 = $ArrayOfMatches[$hash{Variable1}]; 
+0

AFAIK,这不起作用 - 全局匹配返回字符串中所有括号的所有匹配。没有/ g,它将返回($ 1,$ 2,...),因为OP需要。 – jpalecek 2009-04-08 08:52:18

+0

它没有/ g。谢谢。 – Meenakshi 2009-04-08 09:27:05

3

($ 1,$ 2,$ 3,...,$ 9)[$ hash {Variable1}]

4

由于您已经在使用散列,因此您可以使用将名称映射到匹配的内置%+。因此,如果您将正则表达式更改为命名匹配,则可以轻松使用%+来检索匹配的部分。

$reg_ex = 'Variable1:\s+(?<foo>.*?)\s+\n\s+Variable2:\s+(?<bar>.*?)\s+\n'; 

匹配成功后,%+应该有钥匙foobar和值将对应于什么匹配。

因此原来的散列可以改成这样的:

my %hash = (
    reg_ex => 'Variable1:\s+(?<foo>.*?)\s+\n\s+Variable2:\s+(?<bar>.*?)\s+\n', 
    groups => [ 'foo', 'bar' ], 
);