Hashes and Pairs

10.1 Pairs

my $p = 'name' => 'Ana';
say $p.key, ' ', $p.value;            # name Ana
my $q = :age(30);                     # colon pair: age => 30
say :verbose, ' ', :!verbose;         # verbose => True, verbose => False
my $size = 10; say :$size;            # size => 10 (variable name becomes the key)
say :3rd;                             # rd => 3
say $p.antipair;                      # Ana => name

10.2 Hashes

my %ages = ana => 30, bo => 25, 'mary jane' => 41;
my %h2 = (:x(1), :y(2));
say %ages<ana>, ' ', %ages{'bo'}, ' ', %ages<mary jane>;    # <...> quotes words; <mary jane> is a slice!
say %ages{'mary jane'};               # 41
%ages<cy> = 35;
%ages<bo>:delete;                     # adverb to delete
say %ages<bo>:exists, ' ', %ages<ana>:exists;   # False True
say %ages.elems, ' ', %ages.keys.sort, ' ', %ages.values.sum;
say %ages<ana cy>;                    # slice: (30 35)
say %ages{'ana', 'cy'}:p;             # pairs slice
say %ages.sort(*.value)».key;         # sorted by value
for %ages.sort(*.key) -> (:$key, :$value) { say "$key: $value" }
for %ages.kv -> $k, $v { say "$k=$v" }
say %ages.pairs.grep(*.value > 28).Hash;
say %ages.antipairs.Hash;             # invert
say %ages.invert;                     # pairs inverted (handles list values)
my %merged = %ages, cy => 99, dee => 22;   # later keys win
say %merged<cy>;                      # 99
my %count;
%count{$_}++ for <a b a c a>;
say %count;                           # {a => 3, b => 1, c => 1}
my %default is default(0);            # missing keys read as 0
say %default<missing>;                # 0
my %nested;
%nested<a><b><c> = 1;
…