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"
.