使用分割功能[Perl]

时间:2018-12-03 17:59:28

标签: perl split

我想在Perl中处理一个字符串。在上一个线程(link)上,我询问如何解析选项。考虑以下字符串: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 :(得分:4)

您可以使用带有/r修饰符(“ return”)的替换:

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

/r在Perl 5.14中引入。

答案 1 :(得分:3)

您可以使用List::Util中的pairmap功能:

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}};

答案 2 :(得分:2)

据我所知,没有一种干净而优雅的方法可以从列表中即时挑选出每个奇数元素。在一种陈述中做到这一点的一种方法

use feature 'state';

$arg{multi} = 
    map { state $cnt; (++$cnt % 2 != 0) ? qq(custom.$_) : $_ } 
    split /[=,]/, $arg{multi};

答案 3 :(得分:2)

=上进行拆分和在,上进行拆分有两个不同的目的,现在您要对=拆分的一侧进行修改,您应该考虑将其拆分。不需要使操作过于简洁。

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

$arg{"multi"} = { map { split /=/,"custom.$_"} split /,/,$str };