perl6哈希键< $ / [0]> ,<&#;;" $ / [0]">和{" $ / [0]"}使值的行为不同

时间:2017-07-27 05:36:53

标签: hash key quote perl6

我有type : amount格式的文件,我想把所有文件都放好 这些行是哈希,其键是 types ,值是 amounts 的总和。

但是, types 的引用似乎会影响到 amounts 表现得很好。有人可以解释如何吗?

以下是文件data的内容:

food :  100.01
gas  :  50.02
food :  20.03
gas  :  30.04

当用%x<$/[0]>构造密钥时,密钥似乎是 正确,但值似乎被推入数组,即使我 想要添加以获得总金额:

home/lisprog$  cat data | perl6 -ne '
    state %x //= {}; 
    if $_ ~~ m/ \s* (\S+) \s* \: \s* (\d+\.\d+) \s* / {
        if %x<$/[0]>:exists {
            %x<$/[0]> += ($/[1].Numeric); 
        } 
        else { 
            %x.push: "$/[0]"=>($/[1].Numeric); 
        } 
    }; 
    END { for %x.kv -> $m, $n { say "$m : $n"; } }' | sort
food : 100.01 20.03
gas : 50.02 30.04

如果使用<"$/[0]">构建密钥,则行为相同:

cat data | perl6 -ne '
    state %x //= {}; 
    if $_ ~~ m/ \s* (\S+) \s* \: \s* (\d+\.\d+) \s* / {
        if %x<"$/[0]">:exists {
            %x<"$/[0]"> += ($/[1].Numeric); 
        } 
        else { 
            %x.push: "$/[0]"=>($/[1].Numeric); 
        } 
    }; 
    END { for %x.kv -> $m, $n { say "$m : $n"; } }' | sort
food : 100.01 20.03
gas : 50.02 30.04

使用%x{"$/[0]"}构造键时,键和值 行为正确:

home/lisprog$  cat data | perl6 -ne '
    state %x //= {}; 
    if $_ ~~ m/ \s* (\S+) \s* \: \s* (\d+\.\d+) \s* / {
        if %x{"$/[0]"}:exists {
            %x{"$/[0]"} += ($/[1].Numeric); 
        } 
        else { 
            %x.push: "$/[0]"=>($/[1].Numeric); 
        } 
    }; 
    END { for %x.kv -> $m, $n { say "$m : $n"; } }' | sort
food : 120.04
gas : 80.06

那么,键如何影响值的行为?或者我问了一个错误的问题?

1 个答案:

答案 0 :(得分:3)

我认为你对<>的作用有误解。它们基本上相当于引号:

say <"foo">    # "foo"

因此,您要检查一个密钥&#39; $ / [0]&#39;存在,它没有,然后push Pair使用正确的双引号(虽然没有必要在那里引用)哈希,创建正确的密钥,如果它还没有存在。

由于$0$/[0]的缩写,m///默认使用$_,而散列中的非现有键会以Any静默创建,你可以像在南瓜Perl 5中一样+= AnyEND块不需要有一个块,你真的需要:

$ cat data | perl6 -ne '
state %x; 
%x{$0} += $1 if m/ \s* (\S+) \s* \: \s* (\d+\.\d+) \s* /;
END for %x.kv -> $m, $n { say "$m : $n" }' | sort

实际上,想到它,实际上闻起来像Mixhttps://docs.perl6.org/type/Mix)。将其作为读者的练习: - )