【问题标题】:blank substitute inside a substitution changes matched string to empty替换中的空白替换将匹配的字符串更改为空
【发布时间】:2020-03-29 07:57:48
【问题描述】:

我正在尝试遵循一段代码。基本上,根据我的理解,这段代码不应该改变 $data 。我错过了什么吗?我正在使用 5.22.3(草莓 perl)。

use strict;
use warnings;
use 5.010;
my $data = 'we are here';
$data =~ s///g;
print "DATA1: $data\n";
$data =~ s{(we)}{
    my $x1 = $1;
    $x1 =~ s///g;
    print "x1: ^^$x1^^\n";
    "$x1"
}e;
print "DATA2: $data\n";

O/P-

DATA1: we are here
x1: ^^^^
DATA2:  are here

【问题讨论】:

  • 对我来说似乎是一个错误。 $x1 =~ s///g; 正在删除 $x1 中的所有内容,而不是删除任何内容(应该如此)。
  • 与 5.28.2 草莓 perl 相同的问题

标签: regex perl substitution


【解决方案1】:

除了split 使用时,空模式告诉匹配/替换运算符使用最后一个模式来成功匹配。

例如,

$ perl -e'$_ = "abba"; s//c/g if /a/ || /b/; CORE::say;'
cbbc

这意味着

$x1 =~ s///g;

等价于

$x1 =~ s/(we)//g;

要绕过该异常,您可以使用

$x1 =~ s/(?:)//g;

说出你的真实情况使用

$re = ...;
s/$re//g;

你可以使用

$re = ...;
s/(?:$re)//g;

$re = ...;
$re = qr/$re/;
s/$re//g;

引用perlop

空模式 //

如果 PATTERN 计算结果为空字符串,则使用最后一个 成功 匹配的正则表达式。在这种情况下,仅支持空模式上的 gc 标志;其他标志取自原始模式。如果之前没有匹配成功,这将(默默地)充当真正的空模式(始终匹配)。

【讨论】:

  • 了解此功能在实践中的用处可能会很有趣?
  • @Håkon Hægland,不知道。没见过用过。我使用的示例使用此功能比不使用更容易,但是否需要这样做?我有效地将它用作跨越 /g 匹配的反向引用,但一开始就很少使用反向引用。
猜你喜欢
  • 2013-11-04
  • 2014-11-12
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
相关资源
最近更新 更多