在Perl中,从多维数组连接字符串会覆盖目标字符串
我用字符串值构建了一个二维数组。始终有12列,但行数不同。现在我想为每一行构建一个字符串,但当我运行以下代码时:在Perl中,从多维数组连接字符串会覆盖目标字符串,perl,multidimensional-array,concatenation,scalar-context,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 = "";
for ($i=0; $i < $ctrLASTROW + 1; $i++) {
for ($k=0; $k < 12; $k++){
$datastring = $DATATABLE[$i][$k]);
$outstring .= $datastring;
}
}
$outstring=”“;
对于($i=0;$i<$ctrLASTROW+1;$i++){
对于($k=0;$k<12;$k++){
$datastring=$DATATABLE[$i][$k]);
$outstring.=$datastring;
}
}
$outstring
取第一个值。然后在第二个内部循环和后续循环中,$outstring
中的值被覆盖。例如,第一个值是“DATE”
,然后是下一次值“ABC”
被输入时。它不是人们所希望的“日期ABC”,而是“ABCE”。“E”
是日期的第四个字符。我想我忽略了标量/列表问题,但我尝试过,谁知道有多少变化是徒劳的。当我第一次启动时,我直接从@DATATABLE
尝试了连接。同样的问题。只会更快。当您遇到问题,例如两个字符串DATE
和ABC
被连接,最终结果是ABCE
,或者其中一个字符串覆盖了另一个字符串时,可能的情况是您有一个来自另一个操作系统的文件,其行结尾是\r\n
,这是chomp
,连接时产生字符串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//;
当您遇到问题,例如两个字符串DATE
和ABC
被串接,最终结果是ABCE
,或者其中一个字符串覆盖了另一个字符串时,可能的情况是,您有一个来自另一个操作系统的文件,其中的行尾\r\n
,即chomp
,连接时产生字符串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//;
您似乎在$k]的末尾有一个离群的近括号)代码>并一如既往地启用“严格”和“警告”。是否有任何未定义的值破坏了连接?不可能重现您的问题。提供输入数据。您是否从文件中读取了行值,其中$k
元素数组的最后一个条目是chomp
ed?意思是你有一个糟糕的行尾问题?你似乎在$k]的末尾有一个错误的右括号)代码>并一如既往地启用“严格”和“警告”。是否有任何未定义的值破坏了连接?不可能重现您的问题。提供输入数据。您是否从文件中读取了行值,其中$k
元素数组的最后一个条目是chomp
ed?意思是您有错误的行尾问题?…若要解决,请将输入记录分隔符设置为实际的行尾:$/=“\r\n”
,或者最好将:crlf
PerlIO层添加到输入文件句柄。然后chomp
将按预期工作。@amon即使您事先不知道行尾,这些解决方案也会工作吗?我的解决方案适用于所有文件。您是对的,替换适用于所有常用的行尾。但是,如果知道行的结尾,那么还有其他更优雅(读为:可维护)且可以说更正确的解决方案。我对银弹、编码检测和行尾猜测过敏。@amon也许你应该发布你自己的答案。这个问题很常见,应该出现在一些常见问题解答中,这样人们就可以找到一个快速解决方案……要解决这个问题,请将输入记录分隔符设置为实际的行尾:$/=“\r\n”
,或者最好将:crlf
PerlIO层添加到输入文件句柄中。然后chomp
将按预期工作。@amon即使您事先不知道行尾,这些解决方案也会工作吗?我的解决方案适用于所有文件。您是对的,替换适用于所有常用的行尾。但是,如果知道行的结尾,那么还有其他更优雅(读为:可维护)且可以说更正确的解决方案。我对银弹、编码检测和行尾猜测过敏。@amon也许你应该发布你自己的答案。这个问题很常见,应该出现在一些常见问题中,这样人们就可以找到一个快速解决方案。