2009-04-08 11 views
1

J'ai un hachage qui contient une expression régulière: le nombre de correspondances à y saisir et les variables et leur position de correspondance. Par exemple:Éléments assortis utilisant regex en Perl

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

Je vais utiliser cette expression régulière dans une autre partie du code où je serai juste de donner dire $to_be_matched_variable =~ /$hash{reg_ex}/ et nous obtenons les résultats requis ici $1, $2 ...

Je dois utiliser la valeur de la clé Variable1, qui indique le numéro de la correspondance à utiliser là où nous utilisons normalement $1.

J'ai essayé de donner $.$hash{Variable1} et $,$hash{Variable1}. Je ne suis pas en mesure de trouver comment encadrer quelque chose qui sera équivalent à $1, $2 ...

+1

Ça sent autre chose ne va pas avec votre architecture. Quelle tâche essayez-vous d'accomplir? –

+0

Je suggère d'avoir reg_ex => qr /.../, donc le tout est un peu plus clair (IMO) – Tanktalus

Répondre

7

Essayez:

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

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

AFAIK, cela ne fonctionne pas - la correspondance globale renvoie toutes les correspondances de toutes les parenthèses dans la chaîne. Sans/g, il retournerait ($ 1, $ 2, ...) comme le PO avait besoin. – jpalecek

+0

Cela a fonctionné sans le/g. Merci. – Meenakshi

+0

Ouais, oups! Je le savais aussi. Je tape toujours par habitude et je découvre plus tard que ce n'est pas ce que je veux! – dreamlax

3

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

+0

Wow! C'est très implicite! Comment très Perl;) – dreamlax

+0

oui, contrairement à MyFineArrayOfMatchesWhereIStoreMyMatchesYouKnow. :) – Ingo

4

Étant donné que vous utilisez déjà un hachage, vous pouvez également utiliser le code %+ intégré qui mappe les noms sur les correspondances. Ainsi, si vous avez changé vos expressions rationnelles en appariement nommé, vous pouvez facilement utiliser %+ pour récupérer les parties correspondantes.

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

Après une rencontre idéale, %+ devrait avoir les clés foo et bar et les valeurs correspondra à ce qui a été adapté.

Ainsi votre hachage pourrait être changé d'origine à quelque chose comme ceci:

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

Les captures nommées sont la voie à suivre si vous pouvez utiliser Perl 5.10. Il y a une capture dans _Learning Perl_ à leur sujet. :) –

Questions connexes