Ich habe eine Datei im Format von type : amount
und ich möchte alle die Linien in einen Hash, dessen Schlüssel setzen sind die types
und die Werte sind die Summe der amounts
.
Es scheint jedoch, dass, wie die types
notiert beeinflusst, wie die amounts
verhalten. Kann mir jemand erklären, wie? Hier
ist der Inhalt der Datei data
:
food : 100.01
gas : 50.02
food : 20.03
gas : 30.04
Wenn die Tasten mit %x<$/[0]>
aufgebaut sind, die Tasten scheinen korrekt zu sein, aber die Werte scheinen in ein Array geschoben werden, obwohl ich hinzufügen möchten den Gesamtbetrag zu erhalten:
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
Das gleiche Verhalten, wenn die Schlüssel mit <"$/[0]">
aufgebaut sind:
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
Wenn die Tasten konstruiert mit %x{"$/[0]"}
, die Schlüssel und Werte korrekt verhalten:
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
So, wie kommt die Schlüssel beeinflussen, wie Werte verhalten? Oder habe ich eine falsche Frage gestellt?
Danke Elizabeth Mattijsen !! Ich hab es jetzt. Mein Fehler war zu denken, dass <> double quote mit Interpolation. Und mit dem Hash-Push, der den richtigen Schlüssel machte, hatte ich Mühe, mein eigenes Missverständnis herauszufinden. Ich werde in die Taschen, Mixe, Sets usw. schauen. Danke !!! – lisprogtor