Perl 中计算的正则表达式替换



我想做一个全局正则表达式替换,其中替换取决于一些不能放在正则表达式中的逻辑。例如:

while ( $var =~ /<IF OPERATOR="(.+?)" VALUE="(.+?)"/>/g ) {
    my $operator = $1;
    my $value = $2;
    if ( $operator eq 'true' && $hash{ $value } ) {
        # replace the entire <IF/>
    }
    if ( $operator eq 'false' && ! $hash{ $value } ) {
        # replace the entire <IF/>
    }
}

如何做 # 替换位?感谢您的任何建议。

您拒绝为此问题提供任何真实数据,或描述您想要的更改,因此很难证明解决方案的可行性。

但是,看起来您需要一个具有/e修饰符的可执行替换。

看看这段代码。我在正则表达式中添加了另一对括号,以便捕获整个模式以及两个属性。实际的替换字符串被放入$replacement并由块返回。

$string =~ s{(<IF OPERATOR="([^"]+)" VALUE="([^"]+)"/>)}{
    my $replacement = $1;
    my $operator    = $2;
    my $value       = $3;
    if ( $operator eq 'true' and $hash{$value} ) {
      $replacement = qq{<if state1="yes"/>};
    }
    elsif ( $operator eq 'false' and not $hash{$value} ) {
      $replacement = qq{<if state1="no"/>};
    }
    $replacement;
}eg;

很多逻辑可以放在正则表达式中。例如,有条件正则表达式,你可以在正则表达式中执行Perl代码。

如果您不想使正则表达式复杂化,可以先提取匹配项的偏移量,然后使用 substr EXPR, OFFSET, LENGTH, '' 将它们拼接出来。

但是为了使用正则表达式的乐趣,带有命名的反向引用和 s///e(评估替换),以下是代码:

#!/usr/bin/perl -w
use strict;
my %hash = (
  foo => 1,
  bar => 0
);
my $var = '
<IF OPERATOR="true" VALUE="foo"/>
<IF OPERATOR="true" VALUE="bar"/>
<IF OPERATOR="false" VALUE="foo"/>
<IF OPERATOR="false" VALUE="bar"/>
';
$var =~
  s`(<IFs+OPERATOR="(?<operator>.+?)"s+VALUE="(?<value>.+?)"/>)
   `$+{operator} eq 'true' && $hash{ $+{value} } || $+{operator} eq 'false' && !$hash{ $+{value} }? 'replacement' : $1
   `xeg;
print $var;
$var=$ARGV[0];
my %hash =(
a => 1,
b => 2
);
while ( $var =~ /<IF OPERATOR="(.+?)" VALUE="(.+?)"/>/ ) {
    my $operator = $1;
    my $value = $2;

    if ( $operator eq 'true' && $hash{ $value } ) {
        $var =~ s/<IF OPERATOR="$operator" VALUE="$value"/>/ReplacemenT/g;
    }
    if ( $operator eq 'false' && ! $hash{ $value } ) {
        $var =~ s/<IF OPERATOR="$operator" VALUE="$value"/>/RR/g;
    }
}
print "$varn";

在类似的东西上'xxx<IF OPERATOR="true" VALUE="a"/>xxx'返回 xxx替换者Txxx

最新更新