Linux Perl在解析和打印文件段时正在更改和消除声明的变量?可能的错误?

Linux Perl在解析和打印文件段时正在更改和消除声明的变量?可能的错误?,linux,perl,Linux,Perl,我尝试使用Perl(为x86_64-linux构建的v5.10.1)解析一个文件,该文件包含三行信息块,如下所示: Header1,Header2,Header3,Header4,Header5,Header6,Header7,Header8,Header9 Slot11,Slot12,Slot13,Slot14,Slot15,Slot16,Slot17,Slot18,Slot19 Slot21, Slot31, Slot11,Slot12,Slot13,Slot14,Slot15,Slot16

我尝试使用Perl(为x86_64-linux构建的v5.10.1)解析一个文件,该文件包含三行信息块,如下所示:

Header1,Header2,Header3,Header4,Header5,Header6,Header7,Header8,Header9
Slot11,Slot12,Slot13,Slot14,Slot15,Slot16,Slot17,Slot18,Slot19
Slot21,
Slot31,
Slot11,Slot12,Slot13,Slot14,Slot15,Slot16,Slot17,Slot18,Slot19
Slot21,
Slot31,
Slot11,Slot12,Slot13,Slot14,Slot15,Slot16,Slot17,Slot18,Slot19
Slot21,
Slot31,
and so on....
现在,我有了每行加载文件的Perl脚本

my @lines; 
while (<$INPUT>) {
    chomp;
    push @lines, $_;
}
如果我将有问题的行更改为:

    print "$cl1\n$cl2\n$ref1\n$ref2\n";
结果如预期,即:

    Slot17
    Slot18
    Slot21
    Slot31

我还调试了脚本,并在出现问题的行之前逐个打印变量,一切正常。问题似乎出在印刷线路上,但我完全不知道是什么原因造成的。此外,这是一个非常简单的脚本,没有太多空间来处理未被注意到的错误。我的计算机如何以及为什么要改变位置并消除输出中的结果?是什么导致这种行为?

我怀疑您的文件包含回车字符

s/\r//消除它们

如果存在变量值与预期值不符的问题,可以通过以下操作使不可打印字符变得明显:

use Data::Dumper;
$Data::Dumper::Useqq=1;
print Dumper $variable;

我怀疑您的文件包含回车字符

s/\r//消除它们

如果存在变量值与预期值不符的问题,可以通过以下操作使不可打印字符变得明显:

use Data::Dumper;
$Data::Dumper::Useqq=1;
print Dumper $variable;

和数组元素从0开始计数,而不是从1开始计数。因此,$line[7]是Slot18,而不是Slot17。

数组元素从0开始计数,而不是从1开始计数。因此,$line[7]是Slot18,而不是Slot17。

不同平台上不同行终止符的问题最好通过使用
\R
正则表达式来解决,该正则表达式匹配任何单个垂直空白字符(包括
LF
CR
)以及在Windows和internet上找到的CR-LF对


chomp
替换为
s/\R\z/
将从任何文件中删除行终止符,无论其来源如何

不同平台上不同行终止符的问题最好通过使用匹配任何单个垂直空白字符的
\R
正则表达式来解决(包括
LF
CR
)以及在Windows和internet上找到的CR-LF对


chomp
替换为
s/\R\z/
将从任何文件中删除行终止符,而不管其来源如何这是正确的,但对回答问题没有帮助。这是正确的,但对回答问题没有帮助。请添加
$Data::Dumper::Useperl=1;
,因为现代数据::Dumper使用XS,简单的hack将不起作用rk@Demiurg什么是简单的黑客行为?
$Data::Dumper::Useqq=1;
@Demiurg这算什么“黑客行为”?它说转储双引号字符串并将非空格空格或不可打印字符显示为转义序列,这正是我想要的。是否使用XS或perl后端无关紧要。您能更好地解释我为什么要添加Useperl吗?请添加
$Data::Dumper::Useperl=1;
,因为现代Data::Dumper使用XS和simple哈克不会的work@Demiurg什么是简单的黑客行为?
$Data::Dumper::Useqq=1;
@Demiurg这算什么“黑客行为”?它说转储双引号字符串并将非空格空格或不可打印字符显示为转义序列,这正是我想要的。是否使用XS或perl后端无关紧要。您能更好地解释我为什么要添加Useperl吗?
use Data::Dumper;
$Data::Dumper::Useqq=1;
print Dumper $variable;