LINUX.ORG.RU

Как заставить в Perl в регулярках считать концом строки и \n и \r\n

 ,


0

1

Столкнулся с подставой, что в nix-ах

if (m/(.{10,})$)/)
{
...
}

символ \r (0x0dh) не покрывается квантификатором $ . В данном примере я выделял из входного файла все строки из 10 или более символов, но обнаружил, что пропускаются строки из 9 символов. Если сделать dos2unix на такой файл с ними, то работает нормально.

Способ с альтернативой

m/(.{10,})(\r|$)/
не подходит, в смысле почему-то все-равно включает \r \r|\n тоже не получается.

Данный пример для иллюстрации проблемы (длину можно и иначе пытаться считать), реальный код несколько сложнее.

★★★★★

Последнее исправление: praseodim (всего исправлений: 7)

Ответ на: комментарий от vtVitus

Ну вот как конкретно мне ограничить выбор минимум 10-символами, чтобы туда не попадали \r ?

Хотелось без костыля, но видимо придется отдельно явно описывать буквенные, цифровые, знаки препинания и другие, кроме /r/n, хотя мог бы обойтись и точкой, если бы расширено понимал конец строки. Или если бы все файлы были только с unix-концом строки.

praseodim ★★★★★
() автор топика
Ответ на: комментарий от praseodim

Ну если хочется исключить только конец, то можно обойтись исключением

vitus@xxx:/tmp$ cat test.txt 
test
vitus@xxx:/tmp$ unix2dos test.txt
unix2dos: преобразование файла test.txt в формат DOS…
vitus@xxx:/tmp$ cat test.txt | perl -lne "print 'yes' if /^([^\r]{5,})\R?$/"
vitus@xxx:/tmp$ cat test.txt | perl -lne "print 'yes' if /^([^\r]{4,})\R?$/"
yes
vitus@xxx:/tmp$ dos2unix test.txt 
dos2unix: преобразование файла test.txt в формат Unix…
vitus@xxx:/tmp$ cat test.txt | perl -lne "print 'yes' if /^([^\r]{4,})\R?$/"
yes
vitus@xxx:/tmp$ cat test.txt | perl -lne "print 'yes' if /^([^\r]{5,})\R?$/"

vtVitus ★★★★★
()
Ответ на: комментарий от Anoxemian

Кстати, да. Хотя все-равно не аккуратно в некотором роде.

Вот есть модуль File:Spec в котором есть catfile, который можно использовать для платформонезависимого соединения путей и файлов. Но аналогичного для конца строк почему-то нет или не знаю.

praseodim ★★★★★
() автор топика
Ответ на: комментарий от praseodim

если мне не изменяет память, то chomp удаляет только то что совпадает с $\ - то есть удалить и виндавозное и человеческую каретку вроде как не могёт.

vtVitus ★★★★★
()
Ответ на: комментарий от vtVitus

Но реально удаляет. Программа правильно заработала после предварительного chomp

praseodim ★★★★★
() автор топика
Ответ на: комментарий от praseodim

Жадный квантификатор. Ограничьте то, что может попадать в него: «не перевод строки».

level1 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.