2012-05-24 1 views
3

Прошло пару месяцев с тех пор, как я был Перлином, но я полностью застрял в том, почему это происходит ...Почему перформанс Perl влияет на выходные данные моей печати?

Я на OSX, если это имеет значение.

Я пытаюсь преобразовать строки в файле как

08/03/2011 01:00 PDT,1.11

в STDOUT линии как

XXX, 20120803, 0100, KWH, 0.2809, A, YYY

Поскольку я читаю файл, я хочу chomp после каждой строки считывается in. Однако, когда я chomp, я нахожу, что моя печать все испортилась. Когда я не chomp, печать прекрасна (за исключением дополнительной строки новой строки ...). Что тут происходит?

while(<SOURCE>) { 
    chomp; 
    my @tokens = split(' |,');  # @tokens now [08/03/2011, 01:00, PDT, 1.11] 

    my $converted_date = convertDate($tokens[0]); 
    my $converted_time = convertTime($tokens[1]); 

print<<EOF; 
$XXX, $converted_date, $converted_time, KWH, $tokens[3], A, YYY 
EOF 
} 

С chomp вызова в там, выход все смешалось:

, A, YYY10803, 0100, KWH, 1.11

Без chomp вызова в там, по крайней мере, печать в правильном порядке, но с дополнительной новой линии :

XXX, 20110803, 0100, KWH, 1.11 
, A, YYY

Обратите внимание, что с chomp в там, как он переписывает символ новой строки «на вершине» в первой строке. Я добавил autoflush $|=1;, но не знаю, что еще делать здесь.

Мысли? И спасибо заранее ....

+2

Откуда у вас файл данных? Возможно ли, что у него есть нечетные символы окончания строки? –

+2

Это обычная проблема с файлом Windows в Unix. См. Предыдущие обсуждения: http://stackoverflow.com/questions/881779/neatest-way-to-remove-linebreaks-in-perl http://stackoverflow.com/questions/1836217/perl-or-something-else-m -проблема http://stackoverflow.com/questions/7534591/cr-vs-lf-perl-parsing – daxim

ответ

9

Линии вашего ввода заканчиваются CR LF. Вы удаляете только LF. Простое решение заключается в использовании следующих вместо chomp:

s/\s+\z//; 

Вы также можете использовать инструмент dos2unix командной строки для преобразования файлов перед передачей их на Perl.

+0

Duh! Спасибо. Вот и все. – user311121

1

Проблема в том, что у вас есть линии конца DOS и выполняются на сборке Unix на Perl.

Одним из решений этого является использование PerlIO::eol. Возможно, вам придется его установить, но в программе нет необходимости в строке use.

Тогда вы можете написать

binmode ':raw:eol(LF)', $filehandle; 

, после чего, независимо от формата или источник файла, линии чтения будет прекращено со стандартным "\n".