我在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
那么,怎么来的钥匙影响值如何表现?还是我问了一个错误的问题?
谢谢伊丽莎白Mattijsen!我现在明白了。我的错误是认为<>会用插值双引号。随着哈希键的推出,我很难找出自己的误解。我会研究袋,混合,套等,谢谢! – lisprogtor