Perl String извлечение на основе символов - PullRequest
0 голосов
/ 28 мая 2018

Будучи разработчиком C, я довольно новичок в Perl Langauge.Мое требование заключается в том, что мне нужно преобразовать значение как

3-6,9 TO=> "3,4,5,6,9"

Также, если в случае значения

3-6,9-18 TO  "3,4,5,6,9,10,11,12,13,14,15,16,17,18".

как этого добиться?Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Один из способов расширения диапазонов:

use strict;
use warnings;

my @newvals = ();
my @retrns = qw(3-6 9 89-99);

findRanges(@retrns);

sub findRanges
{
    my @vals = @_;

    @newvals = map { if($_=~m/(\d+)\-(\d+)/) { ($1 .. $2); } else { $_; }  } @vals;
}

print join "\n", @newvals;
0 голосов
/ 28 мая 2018

Необходимо выполнить двойное деление, чтобы можно было обнаружить пропущенный конец диапазона при печати 3,9-12 и 3-6,9

use warnings;
use strict;
use feature 'say';

foreach my $string (q(3-6,9), q(3-6,9-12), q(3,9-12))
{
    my @ranges = split /,/, $string;   #/

    my @result;
    for (@ranges) {
        my ($beg, $end) = split /-/;
        push @result, ($end ? $beg .. $end : $beg);
    }

    my $res = join ',', @result;

    say $res;
}

3,4,5,6,9
3,4,5,6,9,10,11,12
3,9,10,11,12

Это работает для большего количества диапазонов в ваших строках 1-3,8,10-12,... и т. Д. См. оператор диапазона (..)

Другой способ обработки пропущенного конца диапазона -

push @result, $beg .. $end // $beg;

, где // - это определенный или оператор


Проверка $end в троичном операторе для «истины», "и он не работает ни для undef, ни для '' (пустая строка), ни для 0 (число ноль).В этой задаче $end предполагается строго положительным целым числом, и это неявно используется.Однако ожидается undef , и лучше быть конкретным

push @result, (defined $end ? $beg .. $end : $beg);

Обратите внимание, что у "правды" в Perl есть еще несколько интересных случаев.Спасибо Silvar за комментарий.

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