代码之家  ›  专栏  ›  技术社区  ›  Chris Dolan

Perl的/m regex修饰符在Windows上是否匹配不同?

  •  5
  • Chris Dolan  · 技术社区  · 16 年前

    以下Perl语句在unixish机器上的行为相同。它们在窗户上的行为是否不同?如果是,是因为魔法吗?

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

    我得到了一个 failure 在我的一个来自Win32 Smoke测试仪的CPAN模块上。它看起来是一个\r\n vs\n问题。我最近做的一个更改是在正则表达式中添加//m。

    3 回复  |  直到 14 年前
        1
  •  12
  •   bart    16 年前

    对于这些正则表达式:

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

    /m和/s都没有意义。

    • S/S:使 . 比赛 \n 也是。 你的regex不包含 .
    • M:制作 ^ $ 与嵌入项旁边的匹配 \n 在字符串中。 你的正则表达式不包含 ^ 也不 $ 或其同义词。

    如果您的输入句柄(socket)是可能的?在文本模式下工作, \r ( \015 )将在Windows上删除字符。

    那么,该怎么办?我建议做 015 可选字符,并根据

    /\015?\012/
    

    不需要/m、/s甚至是前导 m// . 这些只是货物崇拜。

        2
  •  3
  •   Aristotle Pagaltzis    16 年前

    没有魔法 \n . 两个 \n \r 在所有基于ASCII的平台上, \cJ \cM 分别。(例外情况包括EBCDIC平台(出于明显原因)和MacOS Classic(其中 \n R 都意味着 厘米 )

    在Windows上发生的神奇之处在于,当通过标记为处于文本模式的文件句柄进行I/O时, \r\n 转换为 \n 阅读时,反之亦然。(还有) \cZ 意思是文件结尾“惊喜!”这是在C运行时库层完成的。

    你需要 binmode 你的插座。

    您还应该删除 /s /m 模式中的修饰符:因为您不使用元字符来修改它们的行为( . 以及 ^ / $ 对,分别),他们不做“货物崇拜”。

        3
  •  1
  •   brian d foy    15 年前

    你为什么要加上 /m ?你想在网上分开吗?这样做 /m 你也需要使用 ^ $ 在正则表达式中:

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

    但是,如果要将大字符串视为行,只需打开对标量引用的文件句柄:

    open my $string_fh, '<', \ $big_string;
    while( <$string_fh> ) {
        ... process a line
        }