hash - perl6 哈希键 <$/[0]> 、 <"$/[0]"> 和 {"$/[0]"} 使值的行为不同

标签 hash key quote raku

我有一个格式为 type : amount 的文件我想把所有 将行放入哈希中,其键为 types 其值为 amounts 的总和

但是,似乎如何 types 被引用会影响 amounts 表现得好。有人能解释一下怎么会这样吗?

这是文件 data 的内容:

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

当键由 %x<$/[0]> 构造时, key 似乎是 正确,但这些值似乎被插入数组中,即使我 想要添加以获得总金额:

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

那么,键如何影响值的行为呢?还是我问错了问题?

最佳答案

我认为您对<>有什么误解做。它们基本上相当于引号:

say <"foo">    # "foo"

所以你要检查键 '$/[0]' 是否存在,但它不存在,然后 push一个Pair到带有正确双引号的哈希值上(尽管不必在那里引用它),如果尚不存在,它创建正确的 key 。

$0$/[0] 的缩写, m///使用$_默认情况下,哈希中不存在的键会使用 Any 静默创建,你可以+= Any就像您在 Pumpkin Perl 5 中所做的那样,并且 END block 不需要有 block ,您只需要:

$ 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

事实上,想想看,它实际上闻起来像 Mix (https://docs.raku.org/type/Mix)。将其作为读者的练习:-)

关于hash - perl6 哈希键 <$/[0]> 、 <"$/[0]"> 和 {"$/[0]"} 使值的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45342171/

相关文章:

php - 去掉所有单引号

Java 类对象哈希更改无需更改源代码

authentication - laravel 的 Auth 使用的是哪个哈希函数?

python - python字典中的多个键,可能吗?

google-apps-script - Google脚本库: Project Key deprecated?

java - JDBC 和 Oracle 数据库 : Escape ' (single quote)

ruby - 在 Ruby 中将散列展平为字符串

c# - RSA.SignHash SHA512 和 SHA256 给出相同的签名长度

python - 通过url从python访问json元素

Android Quote 应用程序,下一步和后退按钮