2011-10-31 4 views
0

J'espère que cette question n'est pas trop simple - Je suis assez inexpérimenté avec perl. Mon problème: Je veux lire et traiter un fichier en morceaux, mais les délimiteurs des blocs peuvent varier. J'ai le fichier entier dans une variable $ text. A titre d'exemple:perl: lire et traiter un fichier en morceaux

One 

Two 

BEGIN 

Three 

Four 

END 

Five 

Je souhaite parcourir ce fichier par morceaux. Je veux lire jusqu'à la ligne vide suivante et enregistrer (et traiter) le résultat en un seul morceau, de sorte que "One" et "Deux" seraient les deux premiers morceaux. Si le nouveau bloc commence par le mot-clé "BEGIN", je souhaite lire et traiter jusqu'au mot-clé "END", de sorte que le bloc soit "Three \ n Four". Comment ferais-je cela en perl?

J'ai lu à propos de la fonction "index", mais je n'ai pas pu le faire passer par mon $ text.

Merci beaucoup!

Répondre

3

Vous pouvez définir le séparateur d'enregistrement d'entrée sur une chaîne vide pour activer le mode "paragraphe". Ensuite, utilisez l'opérateur flip-flop pour gérer la plage entre BEGIN/END; Quelque chose comme:

perl -nle '$/="";if (/^BEGIN/../^END/) {print "> $_"} else {print "[ $_ ]"}' myfile 
+0

Merci, l'opérateur de flip flop semble en effet comme la chose que je cherchais. Mon problème est maintenant comment puis-je casser la boucle à la fin de l'instruction if? Parce que, d'après ce que je comprends, l'autre reviendra vrai pour toujours? – Thomas

+0

L'opérateur de plage renvoie true lorsque la première expression est vraie. Cela reste le cas jusqu'à ce que la deuxième expression soit vraie, ce qui entraîne alors l'opérateur false à retourner false. Dans l'extrait de code affiché, des séquences supplémentaires BEGIN..END seraient traitées comme vous l'avez vu. Si vous utilisez? BEGIN? ..? END? Au lieu de /BEGIN/../END/, seul le premier bloc "BEGIN-END" sera apparié. – JRFerguson

+0

Oui, excusez-moi, vous avez absolument raison. J'avais essayé de mettre votre code dans un script Perl et l'exécuter sur le fichier entier concaténé en une variable; cela fonctionne avec l'opérateur de diamant. – Thomas

Questions connexes