2009-04-08 47 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' ], 
);