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

时间:2011-08-01 18:10:25

标签: perl

Perl的/ m修饰符在这个例子中意味着什么?

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

 $/="__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,假设我在输入记录分隔符设置为数据的同时使用/ 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;
  }

2 个答案:

答案 0 :(得分: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$

我被问及

...$\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 :(得分:1)

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