сопоставление шаблонов perl по одному и обработка - PullRequest
2 голосов
/ 05 октября 2011

У меня есть строка

[something]text1[/something] blah blah [something]text2[/something]

Мне нужно написать сценарий Perl, чтобы прочитать, что находится в теге [something], обработать его до «text-x» и вернуть его с помощью *Тег 1005 *.Таким образом, приведенная выше строка должна быть

[otherthing]text-1[/otherthing] blah blah [otherthing]text-2[/otherthing]

Обработка «textx» в «text-x» не является одношаговым процессом.

Так что это решение, которое у меня есть до сих пор:

m/[something](?<text>.*)[/something]/

Это даст мне промежуточную строку, и я смогу обработать ее до "text-x", но как мне вернуть ее обратно в то же место с [otherthing]text-x[/otherthing]?

  1. Как мне использовать s /// в этом случае?
  2. Как сделать это для всей строки одна за другой?

Ответы [ 3 ]

2 голосов
/ 05 октября 2011

Вы можете использовать переключатель /e на s///, чтобы оценить правую часть перед использованием результата в качестве замены, и флаг /g, чтобы сделать это для каждого совпадения.

Вот простой пример:

use 5.12.0;

my $str = ">1<  >2<  >34<";

$str =~ s/>(\d+)</">>".process("$1")."<<"/eg;

say $str;

sub process {
    return "x" x $_[0];
}
2 голосов
/ 05 октября 2011

Это должно быть близко. Он использует модификатор / e, чтобы позволить вам выполнять обработку на стороне замены регулярного выражения, и поэтому вызывает функцию fix_textx, где вы можете сделать несколько шагов.

Обычный способ перебора совпадений - с модификатором / g.

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

my $string = '[something]text1[/something] blah blah [something]text2[/something]';

$string =~ s{\[something\](text[^[]*)\[\/something\]}
            {'[otherthing]' . fix_textx($1) . '[/otherthing]'}ge;

print $string;

sub fix_textx {
    my ($testx) = @_;
    $testx =~ s/text\K(.*)/-$1/;
    return $testx;
}

РЕДАКТИРОВАТЬ: фиксированная квадратная скобка. Спасибо @ tadmc

0 голосов
/ 05 октября 2011

В этом конкретном случае вы можете выполнить то, что вы пытаетесь сделать, разделив строку на "[something]", а затем обработав начало каждого фрагмента (кроме первого), а затем соединяя фрагменты обратно, когда вы ' готово.

Я не знаю, существует ли общий способ перебора совпадений регулярных выражений в строке в Perl. Я надеюсь, что кто-то еще ответит на этот вопрос и научит меня этому.

...