Проблема регулярного выражения Perl - PullRequest
0 голосов
/ 09 сентября 2009

У меня есть это условие в Perl-скрипте:

if ($lnFea =~ m/^(\d+) qid\:([^\s]+).*?\#docid = ([^\s]+) inc = ([^\s]+) prob = ([^\s]+)$/)

и $ lnFea представляет такую ​​строку:

0 qid: 7968 1: 0,000000 2: 0,000000 3: 0,000000 4: 0,000000 5: 0,000000 6: 0,000000 7: 0,000000 8: 0,000000 9: 0,000000 10: 0,000000 11: 0,000000 12: 0,000000 13: 0,000000 14: 0,000000 15 : 0,000000 16: 0,005175 17: 0,000000 18: 0,181818 19: 0,000000 20: 0,003106 21: 0,000000 22: 0,000000 23: 0,000000 24: 0,000000 25: 0,000000 26: 0,000000 27: 0,000000 28: 0,000000 29: 0,000000 30: 0,000000 31: 0,000000 32: 0,000000 33: 0,000000 34: 0,000000 35: 0,000000 36: 0,000000 37: 0,000000 38: 0,000000 39: 0,000000 40: 0,000000 41: 0,000000 42: 0,000000 43: 0,055556 44: 0,000000 45: 0,000000 46: 0,000000 # документ = GX000- 00-0000000 inc = 1 prob = 0.0214125

Проблема заключается в том, что if истинно в Windows, но ложно в Linux (Fedora 11). Обе системы используют самую последнюю версию Perl. Так в чем же причина этой проблемы?

1 Ответ

10 голосов
/ 09 сентября 2009

Предполагая, что $InFea читается из файла, я бы поспорил, что файл в формате DOS. Это может привести к тому, что якорь $ предотвратит сопоставление в Linux из-за различий в конце строк между этими платформами. Автоматическое преобразование новой строки в Perl работает только для текстовых файлов на платформе. Если входной файл в формате DOS, в окне Linux появится дополнительный символ возврата каретки до конца строки.

Вероятно, лучше всего конвертировать входной файл в собственный формат для каждой платформы. Если это невозможно, вы должны binmode дескриптор файла (не позволяющий Perl выполнять преобразования новой строки) перед чтением из него и учитывать различные последовательности новой строки в регулярном выражении и везде, где используются данные.

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