Perl: Могу ли я хранить обратные ссылки (не их значения) в переменных? - PullRequest
6 голосов
/ 15 декабря 2009

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

my $text = "The owls are not what they seem.";  
my $pattern = '(\s+)';  
my $replacement = '-$1-';  
$text =~ s/$pattern/$replacement/g;  

$ текст должен быть таким: -wls- -are- -not--what- -they- -seem.

Но, конечно, это больше похоже на: «$ 1-owls- $ 1-are- $ 1-not-$ 1-what- $ 1-они- $ 1-кажутся.

Я перепробовал все виды обратных ссылок ($ 1, \ 1, \ g {1}, \ g1), но все они этого не сделали Работа. Модификатор / e также не работает. Возможно ли это вообще?

Цель состоит в том, чтобы изменить некоторый текст внутри объекта строкой, подобной этой: $ object-> replace ('(.) oo', '$ 1ar')

Есть еще идеи, как это можно сделать?

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

Ответы [ 3 ]

12 голосов
/ 15 декабря 2009

Вы можете оценить и затем расширить строки, используя /ee:

my $text = "The owls are not what they seem.";
my $pattern = '(\s+)';
my $replacement = q{"-$1-"};
$text =~ s/$pattern/$replacement/eeg;

С perldoc perlop :

e Оцените правую часть как выражение.

ee Оцените правую часть как строку, затем оцените результат

Однако я чувствовал бы себя безопаснее с

my $replacement = sub { "-$1-" };
$text =~ s/$pattern/$replacement->()/eg;

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

3 голосов
/ 15 декабря 2009

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

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 и позволяет использовать такие модификаторы, как / g. Код взят из этого узла Perl Monks , но я написал этот узел, так что все в порядке:)

0 голосов
/ 15 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...