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;
}
答案 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)
你的假设是正确的,多行导致^和$匹配字符串的开头和结尾,而没有它你在新行(和字符串结尾)之间匹配。