2013-09-30 61 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