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

标签 linux perl

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

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//; 消除它们。

如果您遇到变量值似乎与您期望的不尽相同的问题,您可以通过执行以下操作使不可打印的字符变得明显:

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

关于linux - Perl 在解析和打印文件段时正在更改和消除声明的变量?可能的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31150295/

相关文章:

CSS图像显示空白?

perl - 这两个 Perl 片段之间有什么区别?

perl - 如何使用GetOpt传递文件

css - 基于当前操作系统的 Python 构建路径 [css imports]

linux - 如何在带有 tortoise git 的 Windows 上使用 linux 生成的 key ?

c - 如何从 linux 内核中的目录获取文件列表?

windows - cpan 与 -MCPAN - Perl

csv - 如何处理CSV文件描述中的逗号

linux - 如何在 Linux 上使用 SmartGit 作为 ssh 客户端克隆 git 存储库?

linux - linux进程调度器如何防止进程饥饿