我有一个格式为 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/