2017-09-22 1 views
1

J'essaie d'extraire du texte et des nombres à partir d'une chaîne en utilisant regex dans Perl. Voici mon code:Application de filtres en Perl à l'aide de Regex

$line = "finish=100\n"; 
($var) = $line =~ /[a-z]+/; 
($val) = $line =~ /[0-9]+/; 

Mon résultat attendu est que $ var = "finish" et val = 100 $ Cependant quand je lance le code $ var = 1 et $ val = 1.

Tous l'aide serait appréciée !!

Répondre

4

Utilisez les parenthèses capturant dans vos expressions régulières:

$line = "finish=100\n"; 
($var) = $line =~ /([a-z]+)/; 
($val) = $line =~ /([0-9]+)/; 
print "$var $val\n"; 

Reportez-vous à perlre

1

Un match regex dans un contexte de liste (où l'expression rationnelle ne pas utiliser le drapeau /g) retourne

  • la liste vide en cas d'échec
  • une liste des sous-chaînes capturées ($1, $2, ...) si elle réussit et le modèle contient des groupes de capture
  • la liste 1 si elle réussit et le modèle ne capture rien

Votre match de regexes, mais ils ne contiennent pas de groupes de capture, de sorte que est pourquoi vous obtenez 1 en $var et $val. Si vous ajoutez des groupes de capture (/([a-z]+)/, /([0-9]+)/), vous obtenez les sous-chaînes correspondantes.

Notez qu'il est peut-être plus facile de le faire en un seul match:

my ($var, $val) = $line =~ /^([a-z]+)=([0-9]+)$/; 

De cette façon, vous validez également que la chaîne d'entrée a la forme attendue et pas seulement quelque chose comme "Cat o' 9 tails", qui (avec vos expressions rationnelles d'origine) extrairait $var = "at" et $val = "9".

0

Vous pouvez aussi obtenir deux valeurs dans un tableau, peut-être avec ceci:

$line = "finish=100\n"; 
@matches = $line =~ /(\w+)\W(\d+)/; 
print "$matches[0], $matches[1]";