Конкатенация строк из многомерного массива перезаписывает целевую строку в Perl
Я построил двухмерный массив со строковыми значениями. Всегда есть 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 ответ
Когда у вас есть проблемы, такие как две строки 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//;