Perl Concat String Усекает начало строки - PullRequest
4 голосов
/ 15 января 2012

Я столкнулся со странной проблемой в Perl, на которую не могу найти ответ.

У меня есть небольшой скрипт, который будет анализировать данные из внешнего источника (будь то файл, веб-сайт,так далее).После того, как данные были проанализированы, они сохранят их в файл CSV.Однако проблема заключается в том, что когда я записываю файл или печатаю данные для скрининга, кажется, что это усекает начало строки.Я использую строгие предупреждения и не вижу никаких ошибок.

Вот пример:

print "Name: " . $name . "\n";
print "Type: " . $type. "\n";
print "Price: " . $price . "\n";
print "Count: " . $count . "\n";

Будет возвращено следующее:

John
Blue
7.99
5

ЕслиЯ пытаюсь сделать это следующим образом:

print "$name,$type,$price,$count\n";

В результате я получаю следующее:

,7.99,5

Я попробовал следующее, чтобы увидеть, где начинается проблема, и получить следующее:

print "$name\n";
print "$name,$type\n";
print "$name,$type,$price\n";
print "$name,$type,$price,$count\n";

Результаты:

John
John,Blue
,7.99
,7.99,5

Я все еще изучаю Perl, но, похоже, не могу выяснить (возможно, из-за недостатка знаний), что является причиной этого.Я попытался отладить скрипт, но я не увидел в переменной цены какого-либо специального символа, который мог бы вызвать это.

Ответы [ 2 ]

5 голосов
/ 15 января 2012

Строка в $price заканчивается возвратом каретки. Это приводит к тому, что ваш терминал перемещает курсор в начало строки, в результате чего первые два поля заменяются следующими.

Вы, вероятно, читаете текстовый файл Windows в окне Unix. Преобразуйте файл (например, используя dos2unix) или используйте s/\s+\z//; вместо chomp;.

Если CR помещен в середину строки, вы можете использовать s/\r//g;.

1 голос
/ 16 января 2012

По предложению @Mat я пропустил вывод через hexdump -C и обнаружил возврат каретки (обозначается шестнадцатеричным значением 0d).Использование кода $price =~ s/\r//g; для удаления CR из строки текста устранило проблему.

Кроме того, входной файл был в формате Windows, а не Unix, выполнил команду dos2unix, чтобы исправить это.

...