【问题标题】:What does Perl's modifier /m = multiline mean?Perl 的修饰符 /m = multiline 是什么意思?
【发布时间】:2011-08-02 03:34:29
【问题描述】:

这个例子中 Perl 的 /m 修饰符是什么意思?

例如,假设我在 Example.txt 文本文件中有以下信息。每行以换行符结束,数据记录为Data 输入记录分隔符设置为:

 $/="__Data__";

 Example.txt

 __Data__
 This is test A.\n
 This is test B.\n
 This is test C.\n
 This is test D.\n

问题1,将输入记录分隔符改为数据后,^和$字符的位置是否如下?

  ^__Data__
  This is test A.\n
  This is test B.\n
  This is test C.\n
  This is test D.\n$

问题 2,假设我在输入记录分隔符仍设置为 Data 的情况下使用 /m 修饰符,是否会将 ^ 和 $ 字符设置为以下?

  ^__Data__$
  ^This is test A.\n$
  ^This is test B.\n$
  ^This is test C.\n$
  ^This is test D.\n$

  if(/__Data__/m)
  {
      print;
  }

【问题讨论】:

  • 你在 Perl 中做过这个实验吗?
  • 是的,但我不清楚如何测试 ^ 和 $ 的位置。使用这个论坛来帮助澄清我的理解。
  • 编辑清理这个问题和标题将有助于新用户不会因为原来是一个有趣的问题而被否决。

标签: perl


【解决方案1】:

/$/ 不受$/ 影响。

没有/m,

  • /^/ 匹配字符串的开头。 (/(?-m:^)//\A/)
  • /$/ 匹配字符串的末尾,以及字符串末尾的换行符之前。 (/(?-m:$)//\Z//(?=\n\z)|\z/)

^__Data__\n          "^" denotes where /(?-m:$)/ can match
This is test A.\n    "$" denotes where /(?-m:$)/ can match
This is test B.\n
This is test C.\n
This is test D.$\n$

使用 /m,

  • /^/ 匹配字符串的开头和“\n”之后。 (/(?m:^)//\A|(?<=\n)/)
  • /$/ 匹配换行符之前和字符串末尾。 (/(?m:$)//(?=\n)|\z/)

^__Data__$\n           "^" denotes where /(?m:^)/ can match
^This is test A.$\n    "$" denotes where /(?m:$)/ can match
^This is test B.$\n
^This is test C.$\n
^This is test D.$\n$

有人问我

...$\n$

首先,我们来演示一下:

>perl -E"say qq{abc\n} =~ /abc$/ ? 1 : 0"
1

>perl -E"say qq{abc\n} =~ /abc\n$/ ? 1 : 0"
1

重点是让/^abc$/ 匹配"abc\n""abc"

>perl -E"say qq{abc\n} =~ /^abc$/ ? 1 : 0"
1

>perl -E"say qq{abc} =~ /^abc$/ ? 1 : 0"
1

【讨论】:

  • 我已经使用 perl 15 年多了,知道m 做得很好,你的帖子让我很困惑。 Plover 将其归结为 9 年前的一句话:/m:使 ^ 匹配在行首(换行符之后)而不是字符串的开头,类似地在末尾匹配 $。 perl.plover.com/yak/regex/samples/slide068.html
  • 现在很清楚了,谢谢ikegami 但我不明白($\n$) 这是测试D.$\n$
  • @Mark,那是错误的。 "$" 可以匹配其他地方然后在字符串的末尾,无论有/没有/m。而且由于 OP 正在询问细节......
  • @jbs,添加到我的节点以扩展 $\n$。
  • @ikegami - 在字符串结尾返回匹配上足够公平,这是 DWIM 的一个奇怪位。我仍然认为使用(?-m:) 和其他晦涩的正则表达式来解释更简单的正则表达式是一个奇怪的选择,而且不太清楚。他确实要求细节和深度,所以你把他埋在里面是对的。 ;-)
【解决方案2】:

你的假设是正确的,多行导致 ^ 和 $ 匹配字符串的开头和结尾,而没有它你匹配换行符(和字符串结尾)。

【讨论】:

    猜你喜欢
    • 2012-05-14
    • 2012-07-08
    • 2015-12-16
    • 2012-01-28
    • 1970-01-01
    • 2018-04-24
    • 2011-08-16
    • 2018-03-05
    相关资源
    最近更新 更多