我想在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"}};
更改为其他内容,也可以将其视为解决方案。
答案 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 };