直到几分钟前,我认为,Perl中的$任何一种行尾匹配.不幸的是,我的假设结果证明是错误的.
以下脚本仅删除单词end$string3.
use warnings;
use strict;
my $string1 = " match to the end" . chr(13);
my $string2 = " match to the end" . chr(13) . chr(10);
my $string3 = " match to the end" . chr(10);
$string1 =~ s/ end$//;
$string2 =~ s/ end$//;
$string3 =~ s/ end$//;
print "$string1\n";
print "$string2\n";
print "$string3\n";
Run Code Online (Sandbox Code Playgroud)
但我几乎75%确定我看到过$至少匹配的情况chr(13).chr(10).
那么,$原子究竟是什么(以及在什么情况下)匹配?
cjm*_*cjm 12
首先,它取决于/m修饰符是否有效.
在/m激活时,它在\n字符之前或字符串末尾匹配.它相当于(?=\n|\z).
如果没有/m,它会在\n字符前匹配,如果它是字符串的最后一个字符,或者在字符串的末尾.它相当于(?=\n?\z).
它与通用换行符不匹配.的\R元字符(在5.10.0介绍)确实是(但没有最终的字符串属性$).您可以替换\R为\n在前面的换算公式之一获得$工作一样,它匹配的通用换行符.
请注意,\n并非总是如此chr(10).这取决于平台.目前使用的大多数平台都有\n意义chr(10),但情况并非总是如此.例如,在较旧的Mac上,\n曾经chr(13)和\r曾经chr(10).
$只匹配\n/ chr(10)之前\r/ 之前的位置chr(13).
它经常被误解为在一个newline角色之前匹配(在很多情况下它不会导致问题),但严格来说它在"换行"字符之前匹配但不在回车字符之前匹配!
请参阅正则表达式教程 - 字符串或行锚的开始和结束.