代码之家  ›  专栏  ›  技术社区  ›  JoelFan

$used有时与perl中的换行符匹配吗?

  •  0
  • JoelFan  · 技术社区  · 14 年前

    我似乎记得在某些情况下 $ 将匹配一个新行(不是“刚才”),但我在文档中找不到任何可以证实这一点的内容。在早期版本的Perl中,这是真的吗?还是我在做梦?

    4 回复  |  直到 14 年前
        1
  •  3
  •   Kilian Foth    14 年前

    你混淆了两个非常相似的东西。这个 $ 比赛 字符串的结尾,如果 /m 未使用,以及 字符串的结尾或字符串的结尾,但最后一行换行符除外,如果 /m 使用。然而,事实并非如此 比赛 (消费)新品本身。例如,您仍然可以将换行符本身与regexp中的其他内容匹配。 \n 或者,如果您还使用 /s 然后 /blah$./sm 理论上会匹配“blah \n”,即使 $ 不是regex中的最后一件事。

    (这实际上不起作用的原因是 $. $\ 实际上被解释为特殊变量而不是 $ . ,所以实际上很难在 $ 在一个正则表达式中。很困惑,不是吗?)

        2
  •  5
  •   Sinan Ünür    14 年前

    一直都是这样。见 perldoc perlreref ( $ 是锚):

    $ 匹配字符串结尾(或行,如果 /m 使用)或在换行符之前

    你应该使用 \z 如果要匹配字符串的结尾:

    \z 匹配绝对字符串结尾

        3
  •  3
  •   szbalint    14 年前

    如果你通过 /s regexp的修饰符,然后 $ 匹配字符串的结尾,并允许 . 相配 \n .

    这可能有点令人困惑。一串 foo\n ,观察以下两者的区别:

    /.$/ # matches 'o'

    /.$/s # still matches 'o'

    /.+$/s # matches 'foo\n'

    /.\z/ # doesn't match at all

    /.\z/s # matches '\n'

        4
  •  1
  •   Jeff    14 年前

    添加“m”修饰符,$将匹配(但不使用)的结尾 线 字符。通常“$”与的结尾匹配 一串 .

    my $sample = "first\nsecond\nthird";
    $sample =~ s/$/END/mg;
    print $sample;
    

    生产:

    firstEND
    secondEND
    thirdEND
    

    如果你想 消费 换行符,只需使用\n转义符:

    my $sample = "first\nsecond\nthird";
    $sample =~ s/\n/END/g;
    print $sample;
    

    现在你得到:

    firstENDsecondENDthird
    

    请注意,“m”修饰符也以与“$”相同的方式影响“^”。