Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中,从多维数组连接字符串会覆盖目标字符串_Perl_Multidimensional Array_Concatenation_Scalar Context - Fatal编程技术网

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

在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=”“

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

$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也许你应该发布你自己的答案。这个问题很常见,应该出现在一些常见问题中,这样人们就可以找到一个快速解决方案。