1

我用字符串值构建了一个二维数组。总是有 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. 同样的问题。只会更快。

4

1 回答 1

4

当您遇到诸如两个字符串并被连接的问题DATEABC,最终结果是ABCE,或者其中一个字符串覆盖了另一个,可能的情况是您有来自另一个操作系统的文件,其行结尾\r\nchomped,连接时产生字符串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//;
于 2013-08-19T00:42:58.917 回答