额外意外字符Perl

额外意外字符Perl,perl,Perl,我正在阅读一个文本文件,其中包含多个由换行符分隔的术语。为了示例起见,我在测试文件中有两个术语 GO:0007161 GO:0061302 又被新线隔开了 我在中阅读了该文件,并尝试了多种方法来删除多余的行: our @GOTOSdata; open (GOTOS, "GOTempUpload/$ARGV[0]"); #or die ("Cannot open GOTreeOrderSearch file for read"); # read each eid from gene set i

我正在阅读一个文本文件,其中包含多个由换行符分隔的术语。为了示例起见,我在测试文件中有两个术语

GO:0007161
GO:0061302
又被新线隔开了

我在中阅读了该文件,并尝试了多种方法来删除多余的行:

our @GOTOSdata; 
open (GOTOS, "GOTempUpload/$ARGV[0]"); #or die ("Cannot open GOTreeOrderSearch file for read"); # read each eid from gene set into array to check if in dbfile
while (<GOTOS>) {
    $_ =~ y/\n//d;
    chomp ($_);
    push (@GOTOSdata, $_);
}
close (GOTOS);
chomp (@GOTOSdata);
our@GOTOSdata;
打开(GOTOS,“gotemupload/$ARGV[0]”)#或者死亡(“无法打开GOTreeOrderSearch文件进行读取”);#将每个eid从基因集中读取到数组中,以检查是否在dbfile中
而(){
$\ux=~y/\n//d;
咀嚼(美元);
推送(@GOTOSdata,$);
}
关闭(GOTOS);
chomp(@GOTOSdata);
我尝试同时使用
chomp
和regex表达式来去除换行符,但是当我使用
length($GOTOSdata[0])
length($GOTOSdata[1])
时,第一个元素的意外长度为11(应该是10),第二个元素的预期长度为10

如果我输入更多的
GO
术语,类似的情况也会发生:最后一个术语是正确的,有10个字符,但其他所有的都是11个字符


如何确保字符串中除了输入的内容之外没有其他内容?

尝试用以下内容替换替换替换内容:

$_ =~ s/\r?\n//;
这应该用零替换\n或\r\n。您还可以考虑删除所有尾随空白:
$_ =~ s/\s+$//;

我怀疑您正在外国平台上处理Windows文本文件。您会看到这些症状,因为Windows文本文件具有两个字符序列CR LF作为行终止符。我想在你最后一行的末尾没有换行

此程序将把所有文件读入数组
@go_data
,并从每个元素中删除所有尾随空格,包括CR和LF以及空格和制表符

请注意,除非有很好的理由,否则不应使用我们的,或在本地标识符中使用大写字母

use strict;
use warnings;
use 5.010;

my ($go_file) = @ARGV;

open my $go_fh, '<', "GOTempUpload/$go_file"
    or die qq{Unable to open "$go_file" for input: $!};

my  @go_data = <$go_fh>;
s/\s+\z// for @go_data;

close $go_fh;

say length for @go_data;
使用严格;
使用警告;
使用5.010;
我的($go_文件)=@ARGV;

打开我的$go_fh,“您的数据文件是在Windows中创建的吗?”?Windows行分隔符使用
\r\n
Chomp删除当前输入记录分隔符,而不是最后一个字符。可以通过设置perl变量
$/
@Nate来设置分隔符谢谢谢谢谢谢!该文件是通过在我的网站上的文本框中输入生成的,该文本框在PHP中使用fwrite。没有预料到它利用了\r\n。修改正则表达式后,它工作得非常好。什么
rtrim
函数?谢谢@Borodin,编辑删除了最后的建议。把我的perl和php搞混了。模块有一个
rtrim
函数,我认为这就是你的意思。我想说你应该引用模块。它所做的只是我自己推荐的
s/\s+\z/
。此外,如果您运行的是Perl5的10版或更高版本,则可以使用
\R
regex模式。它匹配在Unicode中分类为垂直空白的任何内容(LF、VT、FF或CR)或两个字符CR LF。这意味着
s/\R\z/
将以Linux、Windows(网络)或旧式Mac OS行结尾“咀嚼”一条记录