2013-09-30 38 views
3

這workfile.txtperl的刪除尾隨行不工作

NC_001778 

NC_005252 

NC_004744 

NC_003096 

NC_005803 

我想在陣列讀它,只有不帶空格或線的字符串。 這段代碼在我的筆記本上做了我想要的東西,但它不能在Linux桌面上工作!

@nodes=<nodefile>; 
    chomp @nodes; 

foreach my $el(@nodes){ 
     chop ($el); 
    } 
print Dumper @nodes; 
#output: `bash-4.2$ perl main.pl 
';AR1 = 'NC_000893 
';AR2 = 'NC_001778 
';AR3 = 'NC_005252 
';AR4 = 'NC_004744 
';AR5 = 'NC_003096 
';AR6 = 'NC_005803 

`

#hexdump -C workfile.txt |head -20 

00000000 4e 43 5f 30 30 30 38 39 33 0d 0d 0a 4e 43 5f 30 |NC_000893...NC_0| 
00000010 30 31 37 37 38 0d 0d 0a 4e 43 5f 30 30 35 32 35 |01778...NC_00525| 
00000020 32 0d 0d 0a 4e 43 5f 30 30 34 37 34 34 0d 0d 0a |2...NC_004744...| 
00000030 4e 43 5f 30 30 33 30 39 36 0d 0d 0a 4e 43 5f 30 |NC_003096...NC_0| 
00000040 30 35 38 30 33 0d 0d 0a 4e 43 5f 30 30 36 35 33 |05803...NC_00653| 
00000050 31 0d 0d 0a 4e 43 5f 30 30 34 34 31 37 0d 0d 0a |1...NC_004417...| 
00000060 4e 43 5f 30 31 33 36 33 33 0d 0d 0a 4e 43 5f 30 |NC_013633...NC_0| 
00000070 31 33 36 31 38 0d 0d 0a 4e 43 5f 30 30 32 37 36 |13618...NC_00276| 
00000080 31 0d 0d 0a 4e 43 5f 30 31 33 36 32 38 0d 0d 0a |1...NC_013628...| 
00000090 4e 43 5f 30 30 35 32 39 39 0d 0d 0a 4e 43 5f 30 |NC_005299...NC_0| 
000000a0 31 33 36 30 39 0d 0d 0a 4e 43 5f 30 31 33 36 31 |13609...NC_01361| 
000000b0 32 0d 0d 0a 4e 43 5f 30 30 32 36 34 36 0d 0d 0a |2...NC_002646...| 
000000c0 4e 43 5f 30 30 34 35 39 35 0d 0d 0a 4e 43 5f 30 |NC_004595...NC_0| 
000000d0 30 32 37 33 34 0d 0d 0a 4e 43 5f 30 30 34 35 39 |02734...NC_00459| 
000000e0 38 0d 0d 0a 4e 43 5f 30 30 34 35 39 34 0d 0d 0a |8...NC_004594...| 
000000f0 4e 43 5f 30 30 38 34 34 38 0d 0d 0a 4e 43 5f 30 |NC_008448...NC_0| 
00000100 30 34 35 39 33 0d 0d 0a 4e 43 5f 30 30 32 36 34 |04593...NC_00264| 
00000110 37 0d 0d 0a 4e 43 5f 30 30 32 36 37 34 0d 0d 0a |7...NC_002674...| 
00000120 4e 43 5f 30 30 33 31 36 33 0d 0d 0a 4e 43 5f 30 |NC_003163...NC_0| 
00000130 30 33 31 36 34 0d 0d 0a 4e 43 5f 30 32 30 31 35 |03164...NC_02015| 

什麼建議嗎?在此先感謝

+0

什麼是期望的輸出? – fugu

+0

「NC_000893'without空格或底線 – Mariya

+0

是否有這對於這個相當常見的DOS的行結束問題的好,推薦的解決方案一個計算器的問題嗎? – TLP

回答

3

問題是,您在此文件中有Windows行結尾,這就是爲什麼當您使用Linux時,您的chomp不正確地刪除行尾。這並不能解釋爲什麼chop不會刪除最後一個字符,chomp後應\r

你的輸出

';AR6 = 'NC_005803 

表示字符串中的最後一個字符其實\r。這不是字符串的實際問題,只是用視覺表示。如果你想看到這個人物寫出來字面上看,你可以使用選項

$Data::Dumper::Useqq = 1; 

然後將產生輸出

$VAR6 = "NC_005803\r"; 

如何解決呢?

一個簡單的解決方法是使用dos2unix實用Linux來修復該文件。爲了解決它在Perl中,你可以做一些像

s/[\r\n]*\z// for @nodes; # remove all \r and \n from end of string 
s/\s*\z// for @nodes;  # remove all whitespace from end of string 
s/\r//g for @nodes;  # remove all \r from string 
tr/\r//d for @nodes;  # same