Perl: я могу сохранить обратные ссылки (не их значения) в переменных?

Я хотел бы сделать что-то вроде этого:

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$')

Какие-либо другие идеи, как это могло быть сделано?

Большое спасибо.

6
задан wuwuwu 15 December 2009 в 15:21
поделиться

3 ответа

Вы можете вычислить, а затем развернуть строки, используя / 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;

Но все зависит от контекста, в котором вы это делаете.

12
ответ дан 9 December 2019 в 20:44
поделиться

$ text = ~ s / $ pattern / - $ 1- / g;

-3
ответ дан 9 December 2019 в 20:44
поделиться

Решение Синан Унюра будет работать, но оно по-прежнему требует, чтобы в какой-то момент замещающая строка была литералом внутри программы. Если эта строка замены исходит из данных, вам нужно сделать что-то более интересное:

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 , но я написал этот узел, так что все в порядке :)

3
ответ дан 9 December 2019 в 20:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: