2009-09-09 10 views
0

정규 표현식 :펄 내가 펄 스크립트에서이 조건이 문제

0 QID : 7968 1 : 0.000000 2 : 0.000000 3 :

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

하고 $ lnFea 라인의 종류를 나타냅니다 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 37 : 0.000000 40 : 0.000000 41 : 0.000000 42 : 0.000000 43 : 0.055556 44 : 0.000000 45 : 0.000000 46 : 0.000000 #docid = GX000-00-0000000 inc = 1 prob = 0.0214125

문제는 if가 true Windows에서는 false이지만 Linux에서는 false입니다 (Fedora 11). 두 시스템 모두 최신 perl 버전을 사용하고 있습니다. 그렇다면이 문제의 원인은 무엇입니까?

답변

10

파일에서 $InFea을 읽으면 파일이 DOS 형식임을 나타냅니다. 이로 인해 $ 앵커가 해당 플랫폼 간의 라인 엔딩의 차이로 인해 Linux에서의 일치를 방지하게됩니다. Perl의 자동화 된 개행 문자 변환은 플랫폼 고유 텍스트 파일에서만 작동합니다. 입력 파일이 DOS 형식 인 경우, Linux 상자는 줄 끝까지 추가 캐리지 리턴을 보게됩니다.

입력 파일을 각 플랫폼의 기본 형식으로 변환하는 것이 가장 좋습니다. 그것이 가능하지 않다면 파일 핸들을 읽기 전에 화일 핸들 (화일 바꾸기를 수행하지 못하도록)을 binmode해야하고 정규식과 그 밖의 데이터가 사용되는 곳의 다양한 개행 시퀀스를 고려해야합니다.

+0

+1 동의합니다. OP는 줄 끝 형식을 변환하거나 선택적 CRLF 시퀀스를 정규식에 포함시켜야합니다. –

+0

+1 나는 똑같은 말을하려고했다. regex의 끝에 $를 제거하면이 경우에 작동 할 수 있습니다. –

+0

또는 : EOL 문자를 제거하고 임의의 혼합 행 끝을 허용하려면 s/\ r // g 및 chomp()를 사용하십시오. 하지만 Mark가 맞을 것입니다. $는 정규식에 아무런 가치를 추가하지 않으며 제거 될 수 있습니다. 수퍼 셋 구문을 수락하는 것은 일반적으로 버그가 아니며 정규 표현식은 유효성이 낮은 파서를 만듭니다. 마지막으로 : 정규식에서 ':'및 '#'문자를 이스케이프 할 필요가 없습니다. –