2016-12-09 56 views
0

我有這樣的作者列表:perl的加入字符串錯誤

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 

我用perl腳本閱讀:

#!/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' 

我不能得到字符串列表被正確連接。 我已經嘗試了'連接'功能,連接字符串,因爲我正在閱讀代碼,它總是一個混雜。

我怎樣才能得到字符串數組串聯正確?

+0

請評論所有'print'並重新運行,因爲它工作正常。 – ssr1012

+0

也許我不清楚,它可以正確打印每個數組元素,但不能正確地連接或連接數組。 – con

+0

你的期望輸出是什麼? – ssr1012

回答

1

您正則表達式改成這樣。這適用於DOS和UNIX格式的文本文件。

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

您的文件/home/con/Downloads/pmcid-PMC4354670.ris應使用命令dos2unix從DOS約定轉換爲標準。

字符串末尾的尾部字符'\ r'是導致問題的原因。

1

繼中行的回答,您可以通過在公開徵集改變<<:crlf解決它沒有DOS2UNIX的:

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

的Perl然後"converts pairs of CR,LF to a single "\n" newline character"

也可以添加/r/n到你的正則表達式的結尾:

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

或者您可以在循環的頂部添加's/\ s + \ z // g;'。 – ikegami

+0

有趣,因爲CR是空白?你知道爲什麼它不能用'\ r'而不是'\ s'嗎? –

+0

你對'\ n'說了算嗎? – ikegami