Perl 替换为空字符串:意外结果

Perl 替换为空字符串:意外结果,perl,substitution,string,Perl,Substitution,String,为什么这两个印刷的数字不同 #!/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>"; #/usr/bin/env perl 使

为什么这两个印刷的数字不同

#!/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>";
#/usr/bin/env perl
使用警告;
使用5.10.1;
我的$sep='';
我的$number=110111;
$number=~s/(\d)(?=(?:\d{3})+\b)/$1$sep/g;
说“A:”;
$number=~s/\Q$sep\E//g;
说“B:”;
输出:

A: <110110110110111>
B: <11111111111>
A:
B:
引用:

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

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

(my $foo = '1') =~ s/1/x/; # successfully match “1”
$number =~ s///g;          # now you’re deleting all 1s
say "B: <$number>";        # <0000>
(my$foo='1')=~s/1/x/;#成功匹配“1”
$number=~s///g;#现在您正在删除所有1
说“B:”#

我认为这应该被弃用,并通过
use warnings
发出警告,很难看出它的好处。

注意,这表明\Q\E和插值是字符串操作,而不是正则表达式本身的一部分,因为它们都是在“模式计算为空字符串”测试之前解析的。如果您真的想防止这种错误,并且您的正则表达式只包含可能全部为空的插值位,那么可以加入一个
(?#)
,它对匹配没有影响,但会使模式非空。Re“我认为这应该被弃用”:确实如此。我碰到这个,浪费了一整天。有一个杂散的
s///g(编辑过程中使用的模板),结果是一些看似奇怪的行为,如仅测试(只读)构造,简化为伪构造
if(/\-\d\d/){}
,影响输出。这两条“相互作用”的线之间大约有700条线。通过减小输入数据的大小,然后减小脚本的大小(删除不影响bug的行)来跟踪它。我只是在事后才发现这个堆栈溢出问题。(Linux上的Perl v5.30.0(Debian deriv.))我通过搜索引擎发现了这个问题:
site:stackoverflow.com Perl empty substitution