6
votes

Suppression du personnage de Newline d'une chaîne à Perl

J'ai une chaîne lue à partir d'un fichier texte, mais à Ubuntu Linux, et j'essaie de supprimer sa nouvelle ligne de la fin.

J'ai utilisé toutes les manières. Mais pour s / \ n | \ r / - / code> (je cherche s'il trouve que tout remplace une nouvelle chaîne de ligne), il remplace la chaîne, mais elle passe toujours à la ligne suivante lorsque je l'imprime. De plus, lorsque j'ai utilisé chomp code> ou chop code>, la chaîne est complètement supprimée. Je ne pouvais trouver aucune autre solution. Comment puis-je résoudre ce problème? P>

use strict;
use warnings;
use v5.12;
use utf8;
use encoding "utf-8";

open(MYINPUTFILE, "<:encoding(UTF-8)", "file.txt");

my @strings;
my @fileNames;
my @erroredFileNames;

my $delimiter;
my $extensions;
my $id;
my $surname;
my $name;

while (<MYINPUTFILE>)
{
    my ($line) = $_;
    my ($line2) = $_;
    if ($line !~ /^(((\X|[^\W_ ])+)(.docx)(\n|\r))/g) {
        #chop($line2);
        $line2 =~ s/^\n+//;
        print $line2 . " WRONG FORMAT!\n";
    }
    else {
        #print "INSERTED:".$13."\n";
        my($id) = $13;
        my($name) = $2;
        print $name . "\t" . $id . "\n";
        unshift(@fileNames, $line2);
        unshift(@strings, $line2 =~ /[^\W_]+/g);
    }
}
close(MYINPUTFILE);


2 commentaires

@TLP S'il vous plaît ne prétendez pas que les classes de caractères PERL ont des définitions ASCII, car c'est tout ce qui ne va pas dans Perl. Vous devez utiliser Les définitions de UTS # 18 Annexe C .


@TLP Oui, bien sûr que ce n'est pas. \ w est égal à [\ p {alphabétique} \ p {mark} \ p {décimal_number} \ p {connector_punctu ation}] . Ceci est bien connu. Il couvre 102 724 points de code à partir de Unicode V6.0, qui est quatre ordres de grandeur plus d'entre eux que le SAFANT 63 que vous mentionnez.


5 Réponses :


7
votes

Vous pouvez essuyer les chevreakes avec quelque chose comme ceci:

print "$line2 WRONG FORMAT!\n";


0 commentaires

4
votes

Vous pouvez faire quelque chose comme:

= ~ tr / \ n //

mais vraiment chomp devrait fonctionner: xxx


aussi s / \ n | \ r // ne remplace que la première occurrence de \ r ou \ n . Si vous vouliez remplacer toutes les occurrences, vous souhaitez que le modificateur global à la fin s / \ r | \ n // g .

Remarque: Si vous y compris \ r pour Windows, il termine généralement sa ligne sous forme \ r \ n afin que vous souhaitiez remplacer les deux (par exemple, S / (?: \ r \ n | \ n ) // ), bien sûr, la déclaration ci-dessus ( s / \ r | \ n // g ) avec le modificateur global prendrait en charge que de toute façon.


0 commentaires

12
votes

Vous connaissez probablement une ligne se terminant par un fichier Windows, causant des problèmes. Par exemple, une chaîne telle que "FOO BAR \ N", serait vraiment "FOO BAR \ R \ N". Lorsque vous utilisez Chomp code> sur Ubuntu, vous supprimeriez tout ce qui est contenu dans la variable $ / code> , qui serait "\ n". Donc, ce qui reste est "foo bar \ r".

C'est une erreur subtile, mais très courante. Par exemple, si vous imprimez "FOO BAR \ R" et ajoutez une nouvelle ligne, vous ne remarquerez pas l'erreur: p> xxx pré>

mais lorsque vous concatéez la chaîne avec une autre chaîne, vous écrase la première chaîne, car \ r code> déplace la poignée de sortie au début de la chaîne. Par exemple: P>

if ($line =~ /^(.+)(\.docx)\s*$/) {
    my $pre = $1;
    my $ext = $2;


0 commentaires

17
votes

Le moyen correct de supprimer des graphèmes d'unicode à la ligne, y compris des paires de CRLF, utilise le métacaracter \ r REGEX, introduit dans V5.10.

Le Utilisez coding . Pragma est fortement obsolète. Vous devez soit utiliser le Utiliser Ouvrir pragma ou utiliser un encodage dans l'argument de mode sur 3-arg Ouvrir ou utilisez binmode . xxx


3 commentaires

@stackoverflow à condition que vous fassiez $ data = ~ s / \ r // g qui pourrait fonctionner; Avis que j'ai supprimé la limite \ z . Je ne sais pas pourquoi vous voulez que toutes les nouvelles lignes ont disparu.


Que diriez-vous de $ / = undef; $ data = ; Data = ~ S / \ r // g; ..?


@Stackoverflow Bien sûr, ça va.



3
votes
$variable = join('',split(/\n/,$variable))

0 commentaires