我有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
那么,键如何影响值的行为?或者我问了一个错误的问题?
答案 0 :(得分:3)
我认为你对<>
的作用有误解。它们基本上相当于单引号:
say <"foo"> # "foo"
因此,您要检查一个密钥&#39; $ / [0]&#39;存在,它没有,然后push
Pair
使用正确的双引号(虽然没有必要在那里引用)哈希,将创建正确的密钥,如果它还没有存在。
由于$0
是$/[0]
的缩写,m///
默认使用$_
,而散列中的非现有键会以Any
静默创建,你可以像在南瓜Perl 5中一样+=
Any
,END
块不需要有一个块,你真的需要:
$ 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.perl6.org/type/Mix)。将其作为读者的练习: - )