Найдите и замените и получите количество замененных значений содержимого

Мне нужно найти и заменить контент, используя известный или неизвестный шаблон регулярного выражения, а затем нам нужно сохранить найденный контент, замененный контент, количество замененного контента: (мне нужно получить это из более 100 замен)

Here we need to get

1) Найдите контент 2) Заменил контент и
3) подсчитывать значения
:

Example: <find> <replace> --> Count

Кроме того, мы не могли предположить, что это может быть то, что мы находим и заменяем, мы должны получить этот отчет.

Я сделал все что было в моих силах:

use strict;
use warnings;

my $str = 'Trp $\mathbf{R}^a$ locates \alpha \beta distantly $\mathrm{R}^a$ from $\mathit{R}^a$ cys25 in both \gamma and cathepsin K, with \alpha high and moderate $\mathbb{R}^1H$ strengths, respectively. The protein $\mathds{R}^a$ modification $\mathds{R}^1H$ largely \beta affects the binding sites and stability \gamma of the \gamma peptides, and the effects depend on \alpha the elemental compositions of the peptides';

#Sample :
$str=~s{<findcontent>}{<replacedcontent>}g;


#Tried something *different*
my $cnt=0; my (@pushStatsreport,$Statsreport) = "";

$str=~s/\\alpha/my $find=$&; my $rep = "\\boldsymbol\{\\alpha\}"; $cnt++; $Statsreport = "Find: $find\tRep: $rep\tCnt: $cnt\n"; ($rep); /ge;
push(@pushStatsreport, $Statsreport); $cnt=0;

$str=~s/\\math(it|rm|bf)\s*([a-z])\b/my $find = $&; my $rep = "\\checkmath$1\{$2\}"; $cnt++; $Statsreport = "Find: $find\tRep: $rep\tCnt: $cnt\n"; ($rep); /ge;
push(@pushStatsreport, $Statsreport);

print join "\n", @pushStatsreport;

мой результат и желаемый результат:

Find: \alpha Rep: \boldsymbol{\alpha} Cnt: 3
Find: \mathbf a Rep: \checkmathbf{a} Cnt: 2

Однако я не мог согласиться с тем, что это лучший способ. Кто-нибудь может мне в этом помочь.

Пожалуйста, подумайте о форматировании вашего кода, используя что-то вроде perltidy; это действительно сложно понять с несколькими операторами в одной строке и такими строками, как $str=~s{<findcontent>}{<replacedcontent>}g; - что это значит? <findcontent> и <replacedcontent> настоящие струны? На более четкий вопрос людям будет легче ответить.

i alarmed alien 10.08.2018 17:39

Входная строка $str содержит только один экземпляр \mathbf{R}, как это согласуется с желаемым выводом \mathbf a? Просьба уточнить

Håkon Hægland 10.08.2018 18:28
0
2
88
1

Ответы 1

Вы можете попытаться поместить поиск и заменить строки в массив массивов, а затем выполнить итерацию, чтобы выполнить замены и собрать счетчики и отчеты:

my @findreplace = (
    [ q<\\\\alpha>, q<\boldsymbol{\alpha}>],
    [ q<\\\\math(it|rm|bf)\s*([a-z])\b>, q<\checkmath$1{$2}>],
);

my (@pushStatsreport, $Statsreport);
for my $item (@findreplace) {
    my ( $regex, $replace ) = @$item;
    my $cnt = $str =~ s{$regex}{'"$replace"'}eeg;
    $Statsreport = "Find: $regex\tRep: $replace\tCnt: $cnt";
    push @pushStatsreport, $Statsreport;
}

Другие вопросы по теме