Конкатенация строк из многомерного массива перезаписывает целевую строку в 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//;
Другие вопросы по тегам