Mostly Harmless Docs/Nested Data Structures

#!/usr/bin/env perl6

my %users =
    'alice' => {
        'email' => 'alice@example.com',
        'pwd' => 's3cr3t',
        'aliases' => ['al', 'allie', 'alster']},
    'bob' => {
        'email' => 'bob@example.com',
        'pwd' => 'abc123',
        'aliases' => ['bob-o', 'Mr. Bob']},
    'charlie' => {
        'email' => 'charlie@example.com',
        'pwd' => 'dog',
        'aliases' => ['Chaz', 'C-ward']};

# Change charlie's password to "change-me".
say "Old password: %users<charlie><pwd>";
%users<charlie><pwd> = 'change-me';
say "New password: %users<charlie><pwd>";

# Add alias "Robert" for bob.
say "bob's aliases: %users<bob><aliases>";
%users<bob><aliases>.push('Robert');
say "bob's aliases: %users<bob><aliases>";

say '-' x 42;

# Print out all user info.
for %users.keys -> $name {
    for %users{$name}.kv -> $k, $v {
        if $k ~~ 'aliases' {
            say "$k:";
            # Print out aliases, one per line.
            for $v.values -> $alias {
                say "\t$alias";
            }
        }
        else {
            say "$k:\t$v";
        }
    }
}

Note how the square brackets are used for creating a list that doesn’t flatten.

Also, when we want to iterate over the values in $v (Control Structures are covered later), we use $v.values. Another option is to use @$v or @($v).


Main | Next: Operators