Кажется, что chomp очищает всю строку или предотвращает ее печать - PullRequest
1 голос
/ 26 апреля 2020

Я следовал учебнику Perl, когда обнаружил довольно странное поведение и не мог понять, почему. В настоящее время я нахожусь на Ubuntu 18.04 и использую стандартную Perl, распространяемую с ним, версию 5.26.1, и с отключенной буферизацией вывода

$|=1;

В какой-то момент в моем сценарии я набираю

<INPUT>;
while(my $line = <INPUT>){
    # chomp($line);
    print "before $line after";
}

Я получаю результат

до Исаа c Ньютон, 99.10, 15051999
до Альберта Эйнштейна, 13.20, 11062012
до Карла Шила, 66.23,01012000
после Рене Декарта, 0,57,10072033
после [моего приглашения]

, раскомментировав chomp Я получаю

после [моего приглашения ]

Для тестирования разделителя записей я заменил внутренний блок следующим образом:

<INPUT>;
while(my $line = <INPUT>){

    print "blah";
    print "$/";
    print "blah\n";
}

и получил результат

бла
бла
бла
бла
бла
бла
бла
бла
[мое приглашение]

я не знаю почему chomp мешает печатать все, кроме того, что кажется последним «после». Кто-нибудь знает, что может происходить?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Ваш файл имеет Windows окончания строк (CR + LF), но вы используете систему Unix (по умолчанию слой преобразования CR + LF⇒LF не добавлен), поэтому вы заканчиваете строкой с CR-символами. .

Вы должны исправить файл с помощью инструмента, подобного dos2unix.

В качестве альтернативы, замените chomp; на s/\s+\z//;.

0 голосов
/ 26 апреля 2020

Следуя совету @ tooli c, я заметил, что файл был подготовлен в Windows. Он показывал символы 0d и 0a в конце каждой строки. chomp, вероятно, удалял только символ новой строки, и возврат каретки, кроме самой последней строки, сбрасывал выходной поток в первую позицию. Это было причиной странного вывода. Его предложение тоже сработало. Поскольку я хочу использовать split в будущем, я решил установить разделитель записей на \r\n. Спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...