Как удалить символы `\ n` из конца строки? - PullRequest
0 голосов
/ 25 июня 2019

Док говорит:

грызть; # избегать \ n в последнем поле

Но когда файл имеет Windows CRLF, только LF удаляется с конца.

my $line =  <STDIN>;
print chomp $line;                 # 1
print map{ ord } split '', $line;  # 46 49 13

Как удалить оба символа CRLF с конца?

Ответы [ 2 ]

4 голосов
/ 25 июня 2019

Ответ Glib: Запустите вашу программу в Windows.

Немного менее ответ Glib: Перед обработкой файла данных пропустите dos2unix.

Почти полностью не ответ Glib:

Документация, на которую вы указываете, начинается с этого:

Эта более безопасная версия chop удаляет любую завершающую строку, которая соответствует текущему значению $/

Поэтому, если вы хотите изменить поведение chomp(), вам нужно изменить значение $/.

{ # Always localise changes to Perl's internal variables.

  local $/ = "\015\012";

  chomp; # Now removes Windows line endings

} # Revert $/ to original value
3 голосов
/ 25 июня 2019

Причина, по которой вы столкнулись с этой проблемой, заключается в том, что методы ввода-вывода файлов Perl настроены для корректной работы с окончаниями строк, используемыми локальной операционной системой.Когда вы читаете файл, использующий другое соглашение о конце строки (например, текстовый файл Windows, обрабатываемый в * nix ОС), это может помешать правильной работе chomp.

В качестве первого предложения вperldoc states, chomp " удаляет любую завершающую строку, которая соответствует текущему значению $/".Итак, если вы знаете, когда вы используете файл Windows по сравнению с файлом * nix, вы можете обойти другое соглашение об окончании строки ОС, установив для $/ соответственно \n для * nix ина \r\n для Windows.

Если вы не знаете, какое соглашение о конце строки использует данный файл, вам придется прибегнуть к регулярному выражению, например $line =~ s/\r?\n\z//.Если в вашей ситуации приемлемо удалить все конечные пробелы (не только окончания строк), $line =~ s/\s+\z// сделает это за вас и потенциально сэкономит вам еще один шаг позже.

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