2016-12-09 2 views
0

ich eine Liste von Autoren wie diese:Perl beitreten Strings falsch

AU - Garrett-Bakelman, Francine E 
AU - Sheridan, Caroline K 
AU - Kacmarczyk, Thadeous J 
AU - Ishii, Jennifer 
AU - Betel, Doron 
AU - Alonso, Alicia 
AU - Mason, Christopher E 
AU - Figueroa, Maria E 
AU - Melnick, Ari M 

, die ich mit einer Perl-Skript lesen:

#!/usr/bin/env perl 

use strict; use warnings; 
my @authors; 
open my $fh, '<', '/home/con/Downloads/pmcid-PMC4354670.ris' or die "Can't read file: $!"; 
while (<$fh>) { 
    if ($_ =~ m/^AU\s+-   #line starts with 'AU' 
    \s+       #whitespace 
    (.*)      #author is represented by non-newline characters, saved as $1 
    /x) { 
     push @authors, $1; 
    } 
} 
close $fh; 
printf("there are %u authors\n", scalar @authors); 
foreach my $author (@authors) { 
    print "$author\n";#prints each element correctly 
} 
print "@authors\n";#but prints the concatenation incorrectly, 'Melnick, Ari Ma Er E Jine E' 
print join ' and ', @authors;#prints 'and Melnick, Ari Ma Er E JE' 

Ich kann die Liste von Strings erhält korrekt verbunden werden. Ich habe versucht, die 'Join' -Funktion, Verketten einer Zeichenfolge, wie ich den Code lese, es ist immer ein Mischmasch.

Wie bekomme ich das Array von Strings korrekt verkettet werden?

+0

Bitte alle 'print' kommentieren und erneut ausführen, da es gut funktioniert. – ssr1012

+0

vielleicht war ich nicht klar, es kann jedes Array-Element korrekt drucken, aber kann das Array nicht korrekt verbinden oder verketten. – con

+0

Was war Ihre erwartete Ausgabe? – ssr1012

Antwort

1

Ihre regex Um dies zu ändern. Dies funktioniert mit DOS- und UNIX-formatierten Textdateien.

if ($_ =~ m/^AU\s+-   #line starts with 'AU' 
\s+       #whitespace 
([^\r\n]*)     #author is represented by non-newline characters, saved as $1 
/x) { 
4

Ihre Datei /home/con/Downloads/pmcid-PMC4354670.ris soll von DOS-Konvention in Standard konvertiert werden mit Befehl dos2unix.

Das abschließende Zeichen '\ r' am Ende der Zeichenfolge ist die Ursache für Ihre Probleme.

1

Weitere BOC Antwort, können Sie es ohne dos2unix lösen, indem die < in Ihrem offenen Aufruf an <:crlf Wechsel:

open my $fh, '<:crlf', '/home/con/Downloads/pmcid-PMC4354670.ris'; 

Perl dann "converts pairs of CR,LF to a single "\n" newline character".

Oder Sie können /r/n bis zum Ende Ihrer regex hinzufügen:

print join ' and ', map { /\AAU - (.*)\r\n/ } <$fh>; 
+0

Oder Sie können 's/\ s + \ z // g;' am Anfang der Schleife hinzufügen. – ikegami

+0

Interessant, weil CR Leerzeichen ist? Weißt du, warum es nicht mit '\ r' statt' \ s' funktioniert? –

+0

Haben Sie das '\ n' berücksichtigt? – ikegami

Verwandte Themen