Как заменить последовательность чисел, разделенных "_" в строке одним числом - PullRequest
0 голосов
/ 17 октября 2019

Скажем, у меня есть строка "mg_delay_1_2_it", в результате чего я могу иметь переменную последовательность чисел, разделенных "_", т. Е. У меня также может быть строка типа "mg_delay_1_2_10_it" или "mg_delay_1_2_5_25_30_it". Я хочу иметь возможность заменить числовую секцию одним числом для создания нескольких версий примера: Если строка: mg_delay_1_2_5_25_30_it, я хочу иметь возможность создавать mg_delay_1_it, mg_delay_2_it, mg_delay_5_it, mg_delay_25_it и mg_delay_30_it из исходной строки. Пожалуйста, как мне сделать это эффективно в Perl?

1 Ответ

0 голосов
/ 17 октября 2019

Попробуйте:

use strict;
use warnings;
use Data::Dumper;

my $str = 'mg_delay_1_2_5_25_30_it';
my $start = 'mg_delay';
my $end = 'it';
if (my ($res) = $str =~ /\Q$start\E_((?:\d+_)+)\Q$end\E/) {
    my @items = $res =~ /(\d+)/g;
    my @versions = map { $start . '_' . $_ . '_' . $end } @items;
    print Dumper(\@versions);
}

Вывод :

$VAR1 = [
          'mg_delay_1_it',
          'mg_delay_2_it',
          'mg_delay_5_it',
          'mg_delay_25_it',
          'mg_delay_30_it'
        ];

В качестве альтернативы, если $start и $end не известны:

my $str = 'mg_delay_1_2_5_25_30_it';
if (my ($start, $res, $end ) = $str =~ /^((?:(?!_\d).)+)_((?:\d+_)+)(.+)$/) {
    my @items = $res =~ /(\d+)/g;
    my @versions = map { $start . '_' . $_ . '_' . $end } @items;
    print Dumper(\@versions);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...