문제

다음 Perl 문은 Unixish 기계에서 동일하게 행동합니다. 그들은 창에서 다르게 행동합니까? 그렇다면 마법 때문입니까?

  split m/\015\012/ms, $http_msg;
  split m/\015\012/s, $http_msg;

나는 얻었다 실패 Win32 연기 테스터의 CPAN 모듈 중 하나에서. r n vs n 문제인 것 같습니다. 내가 최근에 만든 한 가지 변경은 내 동정형에 // m을 추가하는 것이 었습니다.

도움이 되었습니까?

해결책

이 regexes의 경우 :

m/\015\012/ms
m/\015\012/s

/m 및 /s는 모두 의미가 없습니다.

  • /s : MATE . 성냥 \n 도. 당신의 정규식에는 포함되어 있지 않습니다 .
  • /m : MATE ^ 그리고 $ 내장 옆에 일치합니다 \n 문자열에서. 당신의 정규식에는 no가 포함되어 있습니다 ^ ...도 아니다 $, 또는 동의어.

입력 핸들 (소켓?)이 텍스트 모드에서 작동하는 경우 실제로 가능한 것은 무엇입니까? \r (\015) 문자는 Windows에서 삭제되었습니다.

그래서 뭘 할건데? 나는 만드는 것이 좋습니다 \015 문자 선택 사항 및 분할

/\015?\012/

/m, /s 또는 심지어 선두가 필요하지 않습니다. m//. 그것들은 단지화물 숭배입니다.

다른 팁

마법은 없습니다 \n. 둘 다 \n 그리고 \r 항상 정확히 하나의 캐릭터와 모든 ASCII 기반 플랫폼에서 \cJ 그리고 \cM 각기. (예외는 EBCDIC 플랫폼 (명백한 이유로)과 MacOS Classic (어디에서 \n 그리고 \r 둘 다 평균 \cM).)

Windows에서 발생하는 마법은 텍스트 모드에 표시된 파일 핸들을 통해 I/O를 수행 할 때 \r\n 번역됩니다 \n 읽을 때, 그 반대는 서면으로. (또한, \cZ 파일 종료-놀라움을 의미합니다!) 이것은 C 런타임 라이브러리 계층에서 수행됩니다.

당신은 필요합니다 binmode 당신의 소켓은 그것을 고정합니다.

당신은 또한 제거해야합니다 /s 그리고 /m 귀하의 패턴에서 수정 자 : 동작을 수정하는 메타 문자를 사용하지 않기 때문에 (. 그리고 ^/$ 각각 쌍), 그들은 아무것도하지 않습니다 -화물 컬트.

왜 추가 했습니까? /m? 당신은 라인에서 나누려고합니까? 그렇게하기 위해 /m 당신은 어느 쪽이든 사용해야합니다 ^ 또는 $ Regex에서 :

my @lines = split /^/m, $big_string;

그러나 큰 문자열을 라인으로 취급하려면 스칼라를 참조하여 파일 핸들을 열기 만하면됩니다.

open my $string_fh, '<', \ $big_string;
while( <$string_fh> ) {
    ... process a line
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top