質問

次の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 は読み取り時に、逆は書き込み時に。 (また、 \ 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
    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top