连接多维数组中的字符串会覆盖Perl中的目标字符串

时间:2013-08-19 00:02:25

标签: perl multidimensional-array concatenation scalar-context

我用字符串值构建了一个二维数组。总共有12列但行数有所不同。现在我想构建每行的字符串,但是当我运行以下代码时:

$outstring = "";
for ($i=0; $i < $ctrLASTROW + 1; $i++) {
    for ($k=0; $k < 12; $k++){
       $datastring = $DATATABLE[$i][$k]);
       $outstring .= $datastring;
    }
}

$outstring取第一个值。然后在第二个内循环和后续循环中,$outstring中的值被覆盖。例如,第一个值是"DATE",然后下一次值"ABC"被送到它。而不是"DATEABC" "ABCE"的希望。 "E"DATE的第四个字符。我想我错过了标量/列表问题,但我已经尝试过谁知道有多少变化无济于事。当我第一次开始时,我直接从@DATATABLE尝试了连接。同样的问题。只有更快。

1 个答案:

答案 0 :(得分:4)

当您遇到诸如连接两个字符串DATEABC之类的问题,并且最终结果为ABCE或其中一个字符串覆盖另一个字符串时,可能的情况是你有一个来自另一个操作系统的文件,其行结尾\r\nchomp,在连接时产生字符串DATE\rABC,然后在打印时变为ABCE

换句话说:

my $foo = "DATE\r\n";
my $bar = "ABC\r\n";   #  \r\n line endings from file
chomp($foo, $bar);     #  removes \n but leaves \r
print $foo . $bar;     #  prints ABCE

要确认,请使用

use Data::Dumper;
$Data::Dumper::Useqq = 1;
print Dumper $DATATABLE[$i][$k];   # prints $VAR1 = "DATE\rABC\r";

要解决问题,而不是chomp使用正则表达式,例如:

$foo =~ s/[\r\n]+\z//;