在Perl中,$匹配到底是什么?

Ren*_*ger 12 regex perl

直到几分钟前,我认为,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).

  • 你的答案的后半部分是误导,如果不是简单的不真实.在内部,Perl*always*表示平台的行结束序列,带有`"\n"`,它总是*`chr(10),或者是ASCII`LF`.这与Linux和Max OS X的外部文件中显示的相同,但是额外的IO层将其转换为Windows和DOS平台上的"CR LF",以及Mac OS v9及更早版本的"CR".``\ r"`从来就不是`chr(13)`或ASCII`CR`. (4认同)
  • @Boridin,你错了,cjm是对的.在MacOS版本中,\n和\ r分别匹配/生成0D和0A.这就是为什么(obselete)建议使用`\ x0D\x0A`来表示CGI输出而不是`\ r \n`.如果你说的是真的,那两个就是等价的.那时PerlIO层甚至都不存在. (2认同)

ste*_*ema 5

$只匹配\n/ chr(10)之前\r/ 之前的位置chr(13).

它经常被误解为在一个newline角色之前匹配(在很多情况下它不会导致问题),但严格来说它在"换行"字符之前匹配但不在回车字符之前匹配!

请参阅正则表达式教程 - 字符串或行锚的开始和结束.