La plus fantastique moyen de supprimer les retours à la ligne (en Perl
Je suis le maintien d'un script qui peut obtenir son entrée à partir de diverses sources, et travaille sur elle par ligne. En fonction de la source utilisée, mais les sauts de ligne peut être de type Unix, Windows, ou même, pour certains, agrégé d'entrée, mixte(!).
Lors de la lecture d'un fichier, il va quelque chose comme ceci:
@lines = <IN>;
process(\@lines);
...
sub process {
@lines = shift;
foreach my $line (@{$lines}) {
chomp $line;
#Handle line by line
}
}
Donc, ce que je dois faire est de remplacer le chomp avec quelque chose qui supprime soit de type Unix ou Windows de style mais les sauts de ligne.
Je suis venue avec beaucoup trop de façons de résoudre cela, l'un de l'habitude inconvénients de Perl 🙂
Quelle est votre opinion sur la plus élégante façon de chomp hors générique mais les sauts de ligne? Ce qui serait le plus efficace?
Edit: Une petite précision - la méthode "process" permet d'obtenir une liste de lignes à partir de quelque part, pas nessecarily lire à partir d'un fichier. Chaque ligne peut avoir
- Pas de fuite mais les sauts de ligne
- De style Unix, mais les sauts de ligne
- De style Windows retours à la ligne (
- Juste Retour de Chariot (lorsque les données originales de style Windows mais les sauts de ligne, et il est lu avec $/= '\n')
- Un agrégées ensemble où les lignes ont des styles différents
- Si le <> opérateur reconnaît les retours à la ligne, à ne pas ronger?
- Voir stackoverflow.com/questions/797993/...
- Mais la <> opérateur ne reconnaît pas les retours à la ligne correctement, et en plus de l'utilisation de <> est un cas spécial, entrée ne sont pas toujours à partir d'un fichier.
- exécuter le code, j'ai juste collé ou lire le joint de sortie qu'il génère. Vous aurez, je l'espère, le point que j'essaie de faire. Le "mixte" est de loin le pire.
Vous devez vous connecter pour publier un commentaire.
Après avoir creusé un peu à travers la perlre docs un peu, je vais vous présenter mes meilleurs suggestion de la mesure qui semble fonctionner assez bien. Perl 5.10 ajout de la \R caractère de classe généralisée saut de ligne:
C'est la même chose que:
Je vais garder cette question ouverte un certain temps encore, juste pour voir si il y a de plus chouette des moyens en attente d'être suggéré.
Chaque fois que je passe par l'entrée et que vous souhaitez supprimer ou remplacer les caractères je le lance par de petits sous-programmes comme celui-ci.
Il peut ne pas être de fantaisie, mais cette méthode de travail a été un sans faute pour moi depuis des années.
Lecture perlport je proposerais quelque chose comme
pour être sûr de la plateforme qui vous êtes et ce que le saut de ligne style, vous pouvez être le traitement, car ce qui est dans \r et \n peuvent différer par le biais de différents Perl saveurs.
Note à partir de 2017: File::Slurp n'est pas recommandée en raison des erreurs de conception et laissés à l'abandon des erreurs. Utilisation Fichier::Slurper ou Chemin D'Accès::Minuscule à la place.
l'extension de votre réponse à la question
Fichier::Slurp résumés loin le Fichier IO trucs et retourne une chaîne de caractères pour vous.
NOTE
Important de noter l'ajout de
/g
, sans elle, donné un multi-ligne de chaîne, il ne fera que remplacer le première délinquance de caractère.Aussi, la suppression de
$
, qui est redondante dans ce but, que nous voulons à la bande tous les sauts de ligne, et pas seulement des sauts de lignes avant ce que l'on entend par$
sur cet OS.Dans un multi-ligne de chaîne,
$
correspond à la fin de la chaîne et qui serait problématique ).Point 3 signifie que le point 2 est fait avec l'hypothèse que vous voulez également utiliser
/m
sinon, ' $ ' serait essentiellement de sens pour quelque chose de pratique dans une chaîne de caractères avec >1 lignes, ou, faire la seule ligne de traitement, un système d'exploitation qui, en fait, comprend$
et parvient à trouver les\R*
que procéder la$
Exemples
Donné les notations ci-dessus, un système d'exploitation qui ne permet pas de comprendre quels que soient vos fichiers '\n' ou '\r' délimiteurs, dans le scénario par défaut avec le système d'exploitation par défaut de délimiteur défini pour
$/
entraînera dans la lecture de votre fichier entier comme une seule chaîne de caractères ( à moins que votre chaîne a le $OS de délimiteurs, où elle permettra de délimiter par qui )Dans ce cas, l'ensemble de ces regex sont inutiles:
/\R*$//
: Efface uniquement la dernière séquence de\R
dans le fichier/\R*//
: Efface uniquement la première séquence de\R
dans le fichier/\012?\015?//
: Quand seulement effacer la première012\015
,\012
, ou\015
séquence,\015\012
entraînera soit\012
ou\015
émis./\R*$//
: Si il arrive à être pas les séquences d'octets de "\015$OSDELIMITER' dans le fichier, puis ensuite PAS mais les sauts de ligne seront supprimés, sauf pour les OS propres.Il semblerait que personne ne comprend de quoi je parle, voici donc un exemple de code, c'est-à testé à PAS supprimer les sauts de ligne. L'exécutez, vous verrez qu'il laisse les sauts de ligne dans.
Pour la CLAIREMENT non Transformés de sortie, voir ici: http://pastebin.com/f2c063d74
Note il y a certaines combinaisons de travaux de cours, mais ils sont probablement ceux que vous avez vous-même naívely testé.
Noter que, dans cette sortie, tous les résultats doivent être de la forme
>|$string|<>|$string|<
avec PAS de LIGNE de FLUX pour être considérée comme valide de sortie.et
$string
est de la forme générale{0}$data{1}$delimiter{2}
où, dans toutes les sources de sortie, il devrait y avoir :{1}
et{2}
|<>|
entre{1}
et{2}
Dans votre exemple, vous pouvez simplement aller de l':
Ou:
Ou:
À l'aide de ces directement sur un fichier:
D'étendre Ted Cambron la réponse ci-dessus, et quelque chose qui n'a pas été abordé ici: Si vous supprimez tous les sauts de ligne sans discernement à partir d'un morceau de texte saisi, vous allez vous retrouver avec les paragraphes les uns des autres, sans espaces, lors de la sortie de ce texte plus tard. C'est ce que j'utilise:
La dernière substitution utilise le g "avides" modificateur de sorte qu'il continue à trouver les doubles espaces jusqu'à ce qu'il remplace tous. (En fait, la substitution de quelque chose de plus que le seul espace)