我有一个看起来像这样的字符串:
width=13
height=15
name=Mirek
我想把它变成哈希(使用Perl 6)。现在我这样做:
my $text = "width=13\nheight=15\nname=Mirek";
my @lines = split("\n", $text);
my %params;
for @lines {
(my $k, my $v) = split('=', $_);
%params{$k} = $v;
}
say %params.perl;
但我觉得应该有更简洁,更惯用的方式来做到这一点。有没有?
答案 0 :(得分:9)
在Perl中,通常有多种方法可以做到这一点,而且当你的问题涉及解析时,一种解决方案当然是正则表达式:
my $text = "width=13\nheight=15\nname=Mirek";
$text ~~ / [(\w+) \= (\N+)]+ %% \n+ /;
my %params = $0>>.Str Z=> $1>>.Str;
另一个有用的数据提取工具是comb()
,它产生以下单行:
my %params = $text.comb(/\w+\=\N+/)>>.split("=").flat;
您也可以这样写出原始方法:
my %params = $text.split("\n")>>.split("=").flat;
甚至更简单:
my %params = $text.lines>>.split("=").flat;
事实上,只要您的数据格式不会变得更复杂,我就可以选择那个。
答案 1 :(得分:2)
如果您有更复杂的数据格式,可以使用grammar
。
grammar Conf {
rule TOP { ^ <pair> + $ }
rule pair {<key> '=' <value>}
token key { \w+ }
token value { \N+ }
token ws { \s* }
}
class ConfAct {
method TOP ($/) { make (%).push: $/.<pair>».made}
method pair ($/) { make $/.<key>.made => $/.<value>.made }
method key ($/) { make $/.lc }
method value ($/) { make $/.trim }
}
my $text = " width=13\n\theight = 15 \n\n nAme=Mirek";
dd Conf.parse($text, actions => ConfAct.new).made;