仅仅是为了好玩,我很新手Perl,正在尝试编写一个简单的文本处理工具,但是我卡在了一个简单的问题上。该工具的规则从一个简单的文本文件中读取(不是从脚本中读取,这可能是至关重要的),是一个简单的模式/替换对数组,用于处理文本文件(类似于每行处理每个规则)。以下是应用转换的子程序:
my ($text, @rules) = @_;
my @lines = split(/\n/, $text);
foreach ( @rules ) {
my $pattern = $_->{"pattern"};
my $replace = $_->{"replace"};
$lines = map {
$_ =~ s/$pattern/$replace/g;
} @lines;
}
return join("\n", @lines);
例如,如果有一个规则,如
pattern=[aeiou]
+replace=*
,那么文本Foo bar
会被处理成F** b*r
。这就是我想要的。但是我不知道为什么不能使用捕获组替换文本内容。比如说,
pattern=([fF])
+replace=<$1>
的结果是<$1>oo bar
,但我期望得到的是<F>oo bar
。我猜我漏掉了一个非常简单的东西。我错过了什么?更新:
经过一些实验,我的最终结果是:
sub escapeSubstLiteral {
my ($literal) = @_;
$literal =~ s/\//\\\//g;
$literal;
}
sub subst {
my ($pattern, $replace, $modifiers) = @_;
$modifiers ||= '';
my $expression = '$text =~ s/' . escapeSubstLiteral($pattern) . '/' . escapeSubstLiteral($replace) . '/' . $modifiers;
return sub {
my ($text) = @_;
eval $expression;
$text;
};
}
$customSubst = subst($pattern, $replace, $modifiersToken);
$foo = $customSubst->($foo);
$bar = $customSubst->($bar);
/e
似乎没有效果,并且会重复上面的行为。将e
修饰符加倍后变成了oo bar
(没有F
)。 - Lyubomyr Shaydariv$1
(以此类推)在文本替换范围内是一种特殊的文本模式,可能无法替换为一个变量?因此,例如,my $REPLACE='"(beep: $1)"'; return $INPUT =~ s/$PATTERN/$REPLACE/eegr;
可以正确地返回替换结果,因为它只是作为脚本执行两次(就像我可以使用s/$PATTERN/(beep: $1)/gr
一样)? - Lyubomyr Shaydariv"
,并使用/geer
,但如果替换规则中已经有"
,那么它将无法工作。my $replace = '"' . $_->{"replace"} . '"';
- hmatt1