2009-04-08 12 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}です。

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

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

は、あなたのアーキテクチャに問題があります。あなたはどんな仕事を達成しようとしていますか? –

+0

私はreg_ex => qr /.../を持つことをお勧めします。したがって、全体が少し明確になります(IMO) – Tanktalus

答えて

7

てみ$1$2と同等になります何かをフレームにどのように見つけることができないのですhash {Variable1}]

+0

AFAIK、これは動作しません - グローバル一致は文字列のすべての括弧のすべての一致を返します。/gがなければ、必要なOPとして($ 1、$ 2、...)を返します。 – jpalecek

+0

/gなしで動作しました。ありがとう。 – Meenakshi

+0

うん、うん!私はそれも知っていた。私は常に習慣からgをタイプし、後でそれが私が望むものではないことを理解する! – dreamlax

3

($ 1、$ 2、$ 3、...、$ 9)[$:私は...

+0

うわー!どのように非常に暗黙の! Perl;) – dreamlax

+0

はい、MyFineArrayOfMatchesWhereIStoreMyMatchesYouKnowとは異なります。 :) – Ingo

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' ], 
); 
+0

名前付きキャプチャは、Perl 5.10を使用することができます。 Perl_に彼らについての覚え書きがあります。 :) –

関連する問題