Windows에서 Perl /M Regex Modifier가 다르게 일치합니까?
문제
다음 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
}