【问题标题】:Substitution with empty string: unexpected result用空字符串替换:意外结果
【发布时间】:2012-10-18 15:02:17
【问题描述】:

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

#!/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>";

输出:

A: <110110110110111>
B: <11111111111>

【问题讨论】:

  • 我通过搜索引擎找到了这个问题:site:stackoverflow.com perl empty substitution

标签: perl substitution string


【解决方案1】:

引用man perlop:

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

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

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

我想说这应该被use warnings 弃用和警告。很难看到好处。

【讨论】:

  • 请注意,这表明 \Q\E 和插值是字符串操作,而不是正则表达式的一部分,因为它们都在“模式评估为空字符串”测试之前被解析。如果您真的想防止这种错误功能,并且您的正则表达式仅包含可能全部为空的插值位,请输入 (?#),这对匹配没有影响,但会使模式非空。
  • Re “我认为这应该被弃用”:确实。我遇到了这个,浪费了一整天。有一个杂散的s///g;(编辑期间使用的模板),结果是一些看似奇怪的行为,如仅测试(只读)构造,减少为虚拟构造if (/\-\d\d/) {},影响输出。两条“相互作用”的线之间大约有 700 条线。它是通过减少输入数据大小和脚本大小(删除不影响错误的行)来追踪的。事后我才发现这个 Stack Overflow 问题。 (Linux 上的 Perl v5.30.0(Debian 衍生版本))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多