繁体   English   中英

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

[英]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表达式(与任何单个垂直空白字符(包括LFCR )以及Windows和Internet上的CR LF对都匹配),可以最好地解决在不同平台上使用行终止符的问题。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM