7
votes

Perl correspondant seulement retourner "1". Booléens? Pourquoi?

Cela doit être évident mais je ne le vois pas.

J'ai un documents contenant des milliers d'enregistrements comme ci-dessous: P>

$record =~ s/Defect/Blefect/


2 commentaires

Qu'attendez-vous exactement dans $ FOO après appariement?


Beaucoup de gens vous ont donné la réponse à la question de la regex, mais je pense que vous demandez un peu de problème xy. J'essaie de faire correspondre les en-têtes numérotés afin que je puisse retirer les données qui leur succèdent : Que voulez-vous que la structure de données finale ressemble? Très probablement, il peut être accompli plus rapidement que de boucler et de segmenter.


6 Réponses :



1
votes
$record =~ /Defect/;
my $foo = $&; # Matched portion of the $record.

0 commentaires

18
votes

Vous devez utiliser des parenthèses de capture pour capturer réellement:

if ($record =~ /(Defect)/ ) {
    print "$1\n";
}


1 commentaires

Brillant. Ça l'a fait. J'ai fouillé et fouillé et je n'ai jamais rencontré de la capture des parenthèses. Je dois être aveugle. Merci beaucoup.



4
votes

L'opérateur = ~ code> Perl prend une chaîne (opérande gauche) et une expression régulière (opérande droite) et correspond à la chaîne contre le RE, renvoyer une valeur booléenne (vrai ou faux) selon que Les correspondances sont.

Perl n'a pas vraiment de type booléen - à la place, chaque valeur (de tout type) est traitée comme «vraie» ou «FAUX» ou «FAUX» dans un contexte booléen - la plupart des choses sont vraies «, mais la chaîne vide et la valeur spéciale« UNDEF »pour des choses non définies sont fausses. Donc, lorsque vous retournez un booléen, il utilise «1» pour true et '' (String vide) pour FALSE. P>

maintenant sur votre dernière question, où essayez d'imprimer 1 $ code> Imprime rien. Chaque fois que vous faites correspondre une expression régulière, perl ensembles 1 $ code>, 2 $ code> ... sur les valeurs des sous-expressions entre parenthèses avec le re. Dans votre exemple, toutefois, il n'y a pas de sous-expressions entre parenthèses, de sorte que 1 $ est toujours vide. Si vous le modifiez à p>

if ($string =~ /regexp with () subexpressions/) {
    ... code that uses $1 etc for the subexpressions matched
} else {
    ... code for when the expression doesn't match at all
}


0 commentaires

9
votes

Je pense que ce que vous voulez vraiment, c'est d'envelopper la regex entre parenthèses: xxx

dans le contexte de la liste, les groupes sont retournés, pas le match lui-même. Et votre code d'origine n'a pas de groupe.


1 commentaires

C'était très utile - merci. J'avais oublié le comportement différent de l'opérateur contraignant dans le contexte scalaire / liste.



0
votes

Si vous souhaitez le résultat d'une correspondance en tant que «vrai» ou «false», faites le match de modèle dans le contexte scalaire. C'est ce que vous avez fait dans votre premier exemple. Vous avez effectué une correspondance de modèle et attribué le résultat à la scalaire mon ($ FOO). SO $ FOO a obtenu une "vraie" ou "false" valeur.

Mais si vous souhaitez capturer le texte correspondant à une partie de votre modèle, utilisez des parenthèses de regroupement, puis vérifiez la variable de $ correspondante. Par exemple, considérons l'expression: xxx

une correspondance sur le mot "parler" attribuera "parler" à 1 $, "écoute" assignera "écouter" à 1 $, etc. C'est ce que vous essayez de faire dans votre deuxième exemple. Le problème est que vous devez ajouter des parenthèses de groupement. "$ record = ~ / défaut /" ne donnera rien à 1 $ car il n'y a pas de regroupement de parenthèses dans le motif.


0 commentaires