Мультиплатформенный Chomp работает на Unix, Windows и Mac текстовых файлов - PullRequest
1 голос
/ 06 августа 2010

В поисках способа разбивать символы новой строки независимо от платформы, на которой были созданы файлы.

Проблема, указанная в perlport # newlines , заключается в том, что символы новой строки кодируются по-разному на каждой платформе:

\ 012 unix

\ 015 \ 012 windows

\ 015 mac

Однако chomp зависит от платформы и удаляет только символ дляплатформу, на которой он работает, или что-либо, установленное переменной $/.

До сих пор я придумал следующее регулярное выражение, которое, кажется, работает:

# multiplatform chomp
s/\015?\012?$//;

Это правильное решениеили я пропускаю некоторые дела и есть лучший?

Ответы [ 3 ]

2 голосов
/ 06 августа 2010

Почему бы просто не использовать

 s/\s+$//;
1 голос
/ 04 июня 2013

\ v соответствует вертикальному пустому пространству, поэтому вы должны иметь возможность использовать

s/\v+$//;

Однако это предполагает, что вы не против вырезать такие вещи, как каналы и вертикальные вкладки.

0 голосов
/ 06 февраля 2017

Если вы действительно хотите отследить все случаи, ваше регулярное выражение отлично подходит для удаления новых строк. Но это не нормально для проверки наличия новой строки, она будет счастливо соответствовать строке без новой строки. Для этого вам нужно все изложить.

m{(\015|\015\012|\012)\z};

Обратите внимание на использование \z. Это потому, что $ будет соответствовать новой строке в конце строки, которая будет воровать из группы захвата.

Реально, вам не нужно беспокоиться о новой строке "Mac". Новая строка «Mac» относится к Mac OS до OS X. Это крайне вряд ли вы столкнетесь с файлом той эпохи, и я говорю это как кто-то, у кого еще есть работающий Mac SE . Так что все, что вам действительно нужно беспокоиться, это переводы Windows и Unix. Обычно это делается так:

s{\015?\012\z}{};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...