Perlの/ m正規表現修飾子はWindowsで異なって一致しますか?
質問
次のPerlステートメントは、Unixのマシン上で同じように動作します。 Windowsで動作が異なりますか?はいの場合、魔法のせいですか?\ n?
split m/\015\012/ms, $http_msg;
split m/\015\012/s, $http_msg;
失敗 Win32スモークテスターのCPANモジュールの1つ。 \ r \ n対\ nの問題のようです。最近行った変更の1つは、正規表現に// mを追加することでした。
解決
これらの正規表現の場合:
m/\015\012/ms m/\015\012/s
/ mと/ sはどちらも意味がありません。
- / s:
。
も\ n
に一致します。 正規表現にが含まれていません。
- / m:文字列に埋め込まれた
\ n
の横にある^
と$
を一致させます。 正規表現には、^
も$
も、それらの同義語も含まれていません。
実際に可能なのは、入力ハンドル(ソケット?)がテキストモードで機能する場合、Windowsでは \ r
( \ 015
)文字が削除されます。
だから、どうする? \ 015
文字をオプションにし、
/\015?\012/
/ m、/ s、または先頭の m //
は不要です。それらは単なるカルトカルトです。
他のヒント
魔法の \ n
はありません。 \ n
と \ r
は常に正確に1文字を意味し、すべてのASCIIベースのプラットフォームでは \ cJ
および \ cMですそれぞれ
。 (例外はEBCDICプラットフォーム(明白な理由のため)とMacOS Classic( \ n
と \ r
は両方とも \ cM
を意味します))
Windowsで発生する魔法は、テキストモードであるとマークされているファイルハンドルを介してI / Oを実行すると、 \ r \ n
が \ n に変換されることです。 code>は読み取り時に、逆は書き込み時に。 (また、
\ cZ
はファイルの終わりを意味します–驚いた!)これはCランタイムライブラリレイヤーで行われます。
ソケットを修正するには、 binmode
が必要です。
また、パターンから / s
および / m
修飾子を削除する必要があります。動作を変更するメタ文字(を使用しないためです。
と ^
/ $
のペア)、これらは何もしません–カーゴカルト。
なぜ / m
を追加したのですか?オンラインで分割しようとしていますか? / m
でこれを行うには、正規表現で ^
または $
を使用する必要があります。
my @lines = split /^/m, $big_string;
ただし、大きな文字列を行として扱いたい場合は、スカラーへの参照でファイルハンドルを開くだけです:
open my $string_fh, '<', \ $big_string;
while( <$string_fh> ) {
... process a line
}