Я хотел бы сделать что-то вроде этого:
my $text = "The owls are not what they seem.";
my $pattern = '(\s+)';
my $replacement = '-$1-';
$text =~ s/$pattern/$replacement/g;
$text должен затем быть: - совы-are-не - какой - они - кажутся.
Но конечно это больше похоже: - 1 сова $ - $1-are-$1-not-$1-what-$1-they-$1 - кажется.
Я попробовал все виды обратных ссылок (1$, \1, \g {1}, \g1), и они все не работали./e модификатор не работал также. Действительно ли это возможно вообще?
Цель состоит в том, чтобы изменить некоторый текст в объекте со строкой как это: $object-> замена ('(.) oo', 'площадь за 1$')
Какие-либо другие идеи, как это могло быть сделано?
Большое спасибо.
Вы можете вычислить, а затем развернуть строки, используя / ee
:
my $text = "The owls are not what they seem.";
my $pattern = '(\s+)';
my $replacement = q{"-$1-"};
$text =~ s/$pattern/$replacement/eeg;
From perldoc perlop :
e
Вычислить правую часть как выражение.
] ee
Вычислить правую часть как строку, а затем вычислить результат
Однако я бы чувствовал себя безопаснее с помощью
my $replacement = sub { "-$1-" };
$text =~ s/$pattern/$replacement->()/eg;
Но все зависит от контекста, в котором вы это делаете.
Решение Синан Унюра будет работать, но оно по-прежнему требует, чтобы в какой-то момент замещающая строка была литералом внутри программы. Если эта строка замены исходит из данных, вам нужно сделать что-то более интересное:
sub dyn_replace {
my ($replace) = @_;
my @groups;
{
no strict 'refs';
$groups[$_] = $$_ for 1 .. $#-; # the size of @- tells us the number of capturing groups
}
$replace =~ s/\$(\d+)/$groups[$1]/g;
return $replace;
}
, а затем использовать его как
$text =~ s/$pattern/dyn_replace($replacement)/eg;
. Обратите внимание, что это также позволяет избежать eval
и позволяет использовать модификаторы, такие как / г. Код взят из этого узла Perl Monks , но я написал этот узел, так что все в порядке :)