使用Perl6方式将具有值对的字符串解析为散列

时间:2015-02-07 20:51:50

标签: perl6

我有一个看起来像这样的字符串:

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;

但我觉得应该有更简洁,更惯用的方式来做到这一点。有没有?

2 个答案:

答案 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;