5

次の Perl ステートメントは、Unixish マシンで同じように動作します。Windows では動作が異なりますか? はいの場合、それは魔法のせいですか\n?

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

Win32 スモーク テスターから CPAN モジュールの 1 つに障害が発生しました。\r\n と \n の問題のようです。最近行った変更の 1 つは、正規表現に //m を追加することでした。

4

3 に答える 3

12

これらの正規表現の場合:

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

/m と /s はどちらも無意味です。

  • /s:も.一致し\nます。あなたの正規表現には含まれていません.
  • /m:文字列に埋め込まれた横に一致^させます。あなたの正規表現には、またはそれらの同義語が含まれていません。$\n^$

入力ハンドル (ソケット?) がテキスト モードで動作している場合、\r( \015) 文字が Windows で削除されている可能性があります。

じゃあ何をすればいいの?\015文字をオプションにして、分割することをお勧めします

/\015?\012/

/m、/s、または先頭のm//. それらはただの貨物カルトです。

于 2008-10-18T09:13:12.467 に答える
3

魔法はありません\n\nとは\r常に正確に 1 文字を意味し、すべての ASCII ベースのプラットフォームではそれぞれ\cJ\cMです。(例外は、EBCDIC プラットフォーム (明白な理由による) と MacOS Classic (ここで\n\r両方が意味する\cM) です)。

Windows で起こる魔法は、テキスト モードであるとマークされたファイル ハンドルを介して I/O を実行すると、読み取り時に\r\n変換さ\nれ、書き込み時にその逆に変換されることです。(また、\cZファイルの終わりを意味すると解釈されます – 驚き!) これは、C ランタイム ライブラリ レイヤーで行われます。

binmodeそれを修正するには、ソケットが必要です。

/sパターンからおよび修飾子も削除する必要があり/mます。動作を変更するメタ文字 (それぞれ.および^/の$ペア) を使用しないため、それらは何もしません – カーゴ カルト。

于 2008-10-18T18:06:38.737 に答える
1

なぜ追加したの/mですか?オンラインで分割しようとしていますか?これを行うには、または正規表現で/m使用する必要があります。^$

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

ただし、大きな文字列を行として扱いたい場合は、スカラーへの参照でファイルハンドルを開くだけです。

open my $string_fh, '<', \ $big_string;
while( <$string_fh> ) {
    ... process a line
    }
于 2008-10-18T16:47:48.973 に答える