如何动态地创建一个替代?

问题描述 投票:2回答:1

我怎么能动态添加改性剂替代?

my $str = 'aaBaabaabaa';
my $mod = 'g';
$str =~ s/b// + $mod;
perl dynamic substitution
1个回答
2
投票

qr/(?X:).../并不像/g只操作修饰语工作。

一种可能的方法是:

#!/usr/bin/perl
use strict;
use warnings;

my $str = 'aaBaabaabaa';

print "BEFORE: ${str}\n";

# regex configuration
my $pattern     = '(.)(.)'; # 'b';
my $replacement = '"$2$1"'; # '';
my $mod         = 'ieg';    # 'g';

# extract operation-only modifiers
my $operation_only = qr/([ge])/;
my %special;
$special{$_}++ foreach ($mod =~ /$operation_only/g);
my $mod_filtered;
($mod_filtered = $mod) =~ s/$operation_only//g;

# generate regex
my $regex    = "(?${mod_filtered}:${pattern})";
my $compiled = qr/$regex/;
print "s/ ${regex} -> ${compiled} / ${replacement} / $mod -> ", join('', sort keys %special), "\n";

# execute substitution
my $replacement_code = sub { return $replacement };
for (1..$special{e} // 0) {
    my $recurse = $replacement_code;
    $replacement_code = sub { return eval $recurse->() };
}

if (exists $special{g}) {
    $str =~ s/$compiled/$replacement_code->()/ge;
} else {
    $str =~ s/$compiled/$replacement_code->()/e;
}

print "AFTER:  ${str}\n";

exit 0;

输出:

$ perl dummy.pl
BEFORE: aaBaabaabaa
s/ (?i:(.)(.)) -> (?^:(?i:(.)(.))) / "$2$1" / ieg -> eg
AFTER:  aaaBbaaaaba
© www.soinside.com 2019 - 2024. All rights reserved.