Perl的修饰符/m = 多行是什么意思?

3

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后,^和$字符是否会定位如下?
  ^__Data__
  This is test A.\n
  This is test B.\n
  This is test C.\n
  This is test D.\n$

假设我在保留输入记录分隔符为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中尝试过这个吗? - Codie CodeMonkey
是的,但我不清楚如何测试^和$的位置。使用这个论坛来帮助澄清我的理解。 - jbs
编辑清理这个问题和标题会帮助新用户不因为一个有趣的问题而被踩。 - Mark
2个回答

9
/$/ 不受 $/ 影响。
没有 /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$

我被问及关于IT技术的问题。
...$\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

1
我已经使用Perl超过15年了,非常了解m的作用,但是你的帖子让我感到困惑。9年前,Plover将其简化为一句话:/m:使^与行(换行符后)开头匹配,而不是字符串开头,并使$在结尾处类似地匹配。http://perl.plover.com/yak/regex/samples/slide068.html - Mark
非常清楚,谢谢ikegami,但我不理解($\n$)这是测试D.$\n$ - jbs
@Mark,那是错误的。"$"可以匹配字符串末尾以外的其他位置,无论是否使用/m选项。而且由于OP正在询问具体内容... - ikegami
@jbs,我在我的节点上添加了一些内容以扩展$\n$。 - ikegami
@ikegami - 对于字符串末尾的匹配,你说得对,这是一种奇怪的 DWIM。我仍然认为使用 (?-m:) 和其他晦涩的正则表达式来解释更简单的正则表达式是一个奇怪的选择,不够清晰。不过他确实要求详细深入的解释,所以你把他埋在里面是正确的。;-) - Mark
@Mark,我独立定义了^$,使用了两个单词和代码。它们都可以独立存在。如果你不想处理(?-m:),那么你也不必这样做,因为它只在数学定义中出现。 - ikegami

1

你的假设是正确的,多行模式会导致 ^ 和 $ 匹配字符串的开头和结尾,而没有多行模式时,你匹配的是换行符之间(以及字符串结尾)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接