[英]Perl is changing and eliminating declared variables when parsing and printing segments of file? Possible bug?
我正在尝试使用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, $_;
}
然后我处理它...
for (my $i = 1; $i <= $#lines; $i+=3) { ###skip the header line
chomp $lines[$i];
my @line = split (/\,/, $lines[$i]);
my $cl1 = $line[6]; #Load Slot17
my $cl2 = $line[7]; #Load Slot18
my $ref1 = $lines[$i + 1]; #Load Slot21
my $ref2 = $lines[$i + 2]; #Load Slot31
chomp $ref1;
chomp $ref2;
chomp $cl1;
chomp $cl2;
#######Beware, problematic line!!!!!!!!
print "$cl1\t$cl2\t$ref1\t$ref2\n";
}
每次我运行此脚本时,输出都与预期的完全不同。
Slot17 Slot31 Slot21
如果我用以下方式更改有问题的行:
print "$cl1\n$cl2\n$ref1\n$ref2\n";
结果符合预期,即:
Slot17
Slot18
Slot21
Slot31
我还在问题行之前调试了脚本并逐个变量打印变量,一切都很好。 问题似乎出在印刷线上,但是我完全不知道是什么原因造成的。 此外,这是一个非常简单的脚本,没有太多空间可以忽略不了的错误。 我的计算机如何以及为什么改变位置并消除输出结果? 是什么导致这种行为?
我怀疑您的文件包含回车符。
用s/\\r//;
消除它们s/\\r//;
在您的输入循环中。
如果遇到变量值似乎与预期不符的问题,可以通过执行以下操作使非可打印字符变得明显:
use Data::Dumper;
$Data::Dumper::Useqq=1;
print Dumper $variable;
通过使用\\R
regex表达式(与任何单个垂直空白字符(包括LF
和CR
)以及Windows和Internet上的CR LF对都匹配),可以最好地解决在不同平台上使用行终止符的问题。
用s/\\R\\z//
替换chomp
将从任何文件中删除行终止符,无论其来源如何
并且数组元素从0开始计数,而不是从1开始计数。因此$ line [7]是Slot18,而不是Slot17。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.