用空字符串替换:意外结果

sid*_*com 13 string perl substitution

为什么两个打印的数字不同?

#!/usr/bin/env perl
use warnings;
use 5.10.1;

my $sep = '';
my $number = 110110110110111;

$number =~ s/(\d)(?=(?:\d{3})+\b)/$1$sep/g;
say "A: <$number>";

$number =~ s/\Q$sep\E//g;
say "B: <$number>";
Run Code Online (Sandbox Code Playgroud)

输出:

A: <110110110110111>
B: <11111111111>
Run Code Online (Sandbox Code Playgroud)

zou*_*oul 15

引用男人perlop:

如果模式计算为空字符串,则使用最后成功执行的正则表达式.

尝试在第二次替换之前插入一个成功的正则表达式匹配,以查看发生了什么:

(my $foo = '1') =~ s/1/x/; # successfully match “1”
$number =~ s///g;          # now you’re deleting all 1s
say "B: <$number>";        # <0000>
Run Code Online (Sandbox Code Playgroud)

我会说这应该被弃用并警告use warnings,很难看到好处.

  • 请注意,这表明\ Q\E和插值是字符串操作,不是正则表达式的一部分,因为它们都是在"模式评估为空字符串"测试之前解析的.如果你真的想要防止这种错误,并且你的正则表达式只包含可能都是空的插值位,则抛出一个`(?#)`,它对匹配没有影响,但使模式非空. (7认同)