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/
6 Réponses :
de Perlop, devis et opérateurs ressemblés à des devis a> [bits entre parenthèses ajoutés par moi]: p>
/ motif / msiixpodualgc p>
recherche une chaîne pour une correspondance de modèle, et dans le contexte scalaire renvoie true [1] si elle réussit, FALSE [UNDEF] si elle échoue. strong> p>
blockQuote>
(en regardant la section sur Perl juste n'a pas em> un type booléen discrète ou codage heureux. P>
s /// code> sera également utile; -) p>
true code> /
false code> alias donc
1 code> et < Code> Undef code> sont souvent utilisés: Cependant, il pourrait très bien pourrait être d'autres valeurs em> sans rendre la documentation incorrecte. P>
1 $ code> ne sera jamais défini car il n'y a pas de groupe de capture: peut-être
$ & code> (aka
est souhaité? (Ou mieux, changez l'expression régulière pour avoir un groupe de capture; -) p>
$ match code>)
Salut, merci pour la réponse. N'est-il pas censé renvoyer une liste des matchs eux-mêmes dans le contexte de la liste? @foo = ($ bug = ~ / défaut /); Imprimer stdout @foo; ou imprimer stdout @foo [0]; me donnera exactement la même chose.
@Mananimal Ajouter un groupe de capture et comparez. :)
$record =~ /Defect/; my $foo = $&; # Matched portion of the $record.
Vous devez utiliser des parenthèses de capture pour capturer réellement:
if ($record =~ /(Defect)/ ) { print "$1\n"; }
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.
L'opérateur 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 = ~ 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.
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
}
Je pense que ce que vous voulez vraiment, c'est d'envelopper la regex entre parenthèses: 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. P> P>
C'était très utile - merci. J'avais oublié le comportement différent de l'opérateur contraignant dans le contexte scalaire / liste.
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: p> 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. p> p>
Qu'attendez-vous exactement dans
$ FOO CODE> 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 code>: 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.