Добавление строки при использовании функции split [Perl] - PullRequest
0 голосов
/ 03 декабря 2018

Я хотел бы обработать строку в Perl.В моей предыдущей теме ( ссылка ) я спрашивал, как анализировать параметрыРассмотрим следующую строку: key1=abc,key2=123,key3=xwz.В предыдущем потоке я получил предложение разобрать, выполнив:

$arg{"multi"} = { split /[=,]/, $arg{"multi"}};

Итак, я получаю следующий вывод:

$VAR1 = {
          'multi' => {
                       'key2' => '123',
                       'key1' => 'abc',
                       'key3' => 'xwz'
                     }
        };

Я хотел бы вставить "custom" перед ключомпоэтому вывод будет:

$VAR1 = {
          'multi' => {
                       'custom.key2' => '123',
                       'custom.key1' => 'abc',
                       'custom.key3' => 'xwz'
                     }
        };

Я могу сделать это, перебирая ключи хеша, но если это возможно, я бы хотел сделать это в той же команде, что и $arg{"multi"} = { split /[=,]/, $arg{"multi"}};.

Я пытался поставить custom перед split и $arg{"multi"}, но это не сработало, как ожидалось.Как решить эту проблему?

РЕДАКТИРОВАТЬ: Есть ли способ сделать это, без импорта каких-либо новых функций и модулей?Если нам нужно изменить $arg{"multi"} = { split /[=,]/, $arg{"multi"}}; на что-то другое, это также рассматривается как решение.

Ответы [ 4 ]

0 голосов
/ 03 декабря 2018

Разделение на = и разделение на , имеют две разные цели, и теперь, когда вы собираетесь разбираться с одной стороной = разделений, вы должны рассмотреть их разделение.Это не должно делать операцию слишком бессмысленной.

$arg{"multi"} = { map { ($k,$v)=split/=/; "custom.$k" => $v } split /,/, $str };

или

$arg{"multi"} = { map { split /=/,"custom.$_"} split /,/,$str }; 
0 голосов
/ 03 декабря 2018

Насколько я могу судить, нет простого и элегантного способа выделить каждый нечетный элемент из списка на лету.Один из способов сделать это в одном утверждении

use feature 'state';

$arg{multi} = 
    map { state $cnt; (++$cnt % 2 != 0) ? qq(custom.$_) : $_ } 
    split /[=,]/, $arg{multi};
0 голосов
/ 03 декабря 2018

Вы можете использовать функцию pairmap из List :: Util :

use List::Util 1.29 'pairmap';
$arg{multi} = { pairmap { ("custom.$a" => $b) } split /[=,]/, $arg{multi} };

Или, поскольку вы создаете хеш здесь, вы можете просто переместить значения в новоеключи потом.

$arg{multi} = { split /[=,]/, $arg{multi} };
$arg{multi}{"custom.$_"} = delete $arg{multi}{$_} for keys %{$arg{multi}};
0 голосов
/ 03 декабря 2018

Вы можете использовать подстановку с модификатором /r («возврат»):

$arg{multi} = { split /[,=]/, $string =~ s/(^|,)/$1custom./gr };

/r была введена в Perl 5.14.

...