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);
5 Réponses :
Vous pouvez essuyer les chevreakes avec quelque chose comme ceci:
print "$line2 WRONG FORMAT!\n";
Vous pouvez faire quelque chose comme:
mais vraiment aussi Remarque: Si vous y compris = ~ tr / \ n // code> p>
chomp code> devrait fonctionner: p >
s / \ n | \ r // code> ne remplace que la première occurrence de
\ r code> ou
\ n code>. Si vous vouliez remplacer toutes les occurrences, vous souhaitez que le modificateur global à la fin
s / \ r | \ n // g code>. P>
\ r code> pour Windows, il termine généralement sa ligne sous forme
\ r \ n code> afin que vous souhaitiez remplacer les deux (par exemple,
S / (?: \ r \ n | \ n ) // code>), bien sûr, la déclaration ci-dessus (
s / \ r | \ n // g code>) avec le modificateur global prendrait en charge que de toute façon. p> p>
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 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> mais lorsque vous concatéez la chaîne avec une autre chaîne, vous écrase la première chaîne, car 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". \ 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;
Le moyen correct de supprimer des graphèmes d'unicode à la ligne, y compris des paires de CRLF, utilise le métacaracter Le \ r code> REGEX, introduit dans V5.10.
Utilisez coding code>. Pragma est fortement obsolète. Vous devez soit utiliser le
Utiliser Ouvrir code> pragma ou utiliser un encodage dans l'argument de mode sur 3-arg
Ouvrir code> ou utilisez
binmode code>. p>
@stackoverflow à condition que vous fassiez $ data = ~ s / \ r // g code> qui pourrait fonctionner; Avis que j'ai supprimé la limite
\ z code>. Je ne sais pas pourquoi vous voulez que toutes les nouvelles lignes ont disparu.
Que diriez-vous de $ / = undef; $ data =
@Stackoverflow Bien sûr, ça va.
$variable = join('',split(/\n/,$variable))
@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 code> est égal à
[\ p {alphabétique} \ p {mark} \ p {décimal_number} \ p {connector_punctu ation}] code>. Ceci est bien connu. Il couvre 102 724 points de code b> à partir de Unicode V6.0, qui est quatre ordres de grandeur i> plus d'entre eux que le SAFANT 63 que vous mentionnez.