这是workfile.txt
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 :(得分:3)
问题是你在这个文件中有Windows行结尾,这就是为什么当你使用linux时,你的chomp
没有正确删除行结尾。它没有解释为什么chop
没有删除最后一个字符,\r
之后应该是chomp
。
您的输出
';AR6 = 'NC_005803
表示字符串中的最后一个字符实际上是\r
。这不是字符串的实际问题,只是视觉表示。如果你想看到字面上写出的这个字符,你可以使用选项
$Data::Dumper::Useqq = 1;
然后将产生输出
$VAR6 = "NC_005803\r";
如何解决?
一个简单的解决方法是使用linux中的dos2unix
实用程序来修复文件。要在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