我想用Perl处理一个字符串。在我之前的帖子(链接(中,我询问了如何解析选项。考虑以下字符串:key1=abc,key2=123,key3=xwz
。在上一个线程中,我得到了一个解析建议:
$arg{"multi"} = { split /[=,]/, $arg{"multi"}};
所以我得到以下输出:
$VAR1 = {
'multi' => {
'key2' => '123',
'key1' => 'abc',
'key3' => 'xwz'
}
};
我想在键之前插入"自定义",所以输出将是:
$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"}};
更改为其他内容,也可以将其视为一种解决方案。
您可以使用带有/r
修饰符("return"(的替换:
$arg{multi} = { split /[,=]/, $string =~ s/(^|,)/$1custom./gr };
/r
是在Perl5.14中引入的。
您可以使用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}};
据我所知,没有一种干净优雅的方法可以快速地从列表中挑选出每一个奇怪的元素。一种在一句话中做到这一点的方法
use feature 'state';
$arg{multi} =
map { state $cnt; (++$cnt % 2 != 0) ? qq(custom.$_) : $_ }
split /[=,]/, $arg{multi};
在=
上进行拆分和在,
上进行拆分有两个不同的目的,现在您要处理=
拆分的一侧,您应该考虑将它们分离。这不需要使操作过于不协调。
$arg{"multi"} = { map { ($k,$v)=split/=/; "custom.$k" => $v } split /,/, $str };
或
$arg{"multi"} = { map { split /=/,"custom.$_"} split /,/,$str };