class Hash

Mapping from strings to itemized values

class Hash is Map { }

A Hash is a mutable Map; it implements Associative through its inheritance of Map and as such provides support for looking up values using keys, providing support for associative subscripting.

Although the order of the hashes is guaranteed to be random in every single call, still successive calls to .keys and .values are guaranteed to return them in the same order:

my %orig = :1a, :2b; my %new = :5b, :6c;
%orig{ %new.keys } = %new.values;
say %orig.perl# OUTPUT: «{:a(1), :b(5), :c(6)}␤»

In this case, b will always be associated to 5 and c to 6; even if two successive calls to keys will return them in different order. Successive calls to any of them separately and repeatedly will always return the same order in any program invocation.

Please see the section on hash literals for different ways to declare a hash. Additionally, they can be declared using curly braces as long as these rules are followed:

given 3 { say WHAT {3 => 4:b}  };     # OUTPUT: «(Hash)␤» 
given 3 { say WHAT {3 => 4:b($_)} };  # OUTPUT: «(Block)␤» 
given 3 { say WHAT {3 => 4:b(.Num)} };# OUTPUT: «(Block)␤» 
say { 'a',:b(3), 'c' }.^name;           # OUTPUT: «Block␤» 

The next-to-last two cases are examples of the generation of Blocks in the presence of the topic variable $_. The last case does not meet the third criterium for generating a hash, and thus generates a Block.

A % in front of parentheses or square brackets will generate a Hash as long as the elements can be paired.

say %'a'3:b(3), 'c'3 ).^name# OUTPUT: «Hash␤»

Elements in this hash can be paired both sides of the Pair :b(3).

say %a b c 1 2 3»).^name;           # OUTPUT: «Hash␤»

An empty hash can be initialized either with empty curly braces or, since 6.d, %().

say %().^name# OUTPUT: «Hash␤» 
say {}.^name;  # OUTPUT: «Hash␤»

Methods

method classify-list

Defined as:

multi method classify-list(&mapper*@list:&as --> Hash:D)
multi method classify-list(%mapper*@list:&as --> Hash:D)
multi method classify-list(@mapper*@list:&as --> Hash:D)

Populates a Hash by classifying the possibly-empty @list of values using the given mapper, optionally altering the values using the :&as Callable. The @list cannot be lazy.

The mapper can be a Callable that takes a single argument, an Associative, or an Iterable. With Associative and an Iterable mappers, the values in the @list represent the key and index of the mapper's value respectively. A Callable mapper will be executed once per each item in the @list, with that item as the argument and its return value will be used as the mapper's value.

Simple classification

In simple classification mode, each mapper's value is any non-Iterable and represents a key to classify @list's item under:

say % .classify-list: { $_ %% 2 ?? 'even' !! 'odd' }^10;
# OUTPUT: «{even => [0 2 4 6 8], odd => [1 3 5 7 9]}␤» 
 
my @mapper = <zero one two three four five>;
my %hash = foo => 'bar';
say %hash.classify-list: @mapper12344;
# OUTPUT: «{foo => bar, four => [4 4], one => [1], three => [3], two => [2]}␤» 

The mapper's value is used as the key of the Hash to which the @list's item will be pushed. See .categorize-list if you wish to classify an item into multiple categories at once.

Multi-level classification

In multi-level classification mode, each mapper's value is an Iterable that represents a tree of hash keys to classify @list's item under:

say % .classify-list: {
    [
        (.is-prime ?? 'prime' !! 'non-prime'),
        ($_ %% 2   ?? 'even'  !! 'odd'      ),
    ]
}^10;
# OUTPUT: 
# { 
#     non-prime => { 
#         even => [0 4 6 8], 
#         odd  => [1 9] 
#     }, 
#     prime => { 
#         even => [2], 
#         odd  => [3 5 7] 
#     } 
# }

NOTE: each of those Iterables must have the same number of elements, or the method will throw an exception. This restriction exists to avoid conflicts when the same key is a leaf of one value's classification but a node of another value's classification.

:&as value modifier

If :&as Callable argument is specified, it will be called once per each item of @list, with the value as the argument, and its return value will be used instead of the original @list's item:

say % .classify-list: :as{"Value is $_"}{ $_ %% 2 ?? 'even' !! 'odd' }^5;
# OUTPUT (slightly altered manually, for clarity): 
# { 
#     even => ['Value is 0', 'Value is 2', 'Value is 4'], 
#     odd  => ['Value is 1', 'Value is 3'] 
# }

method categorize-list

Defined as:

multi method categorize-list(&mapper*@list:&as --> Hash:D)
multi method categorize-list(%mapper*@list:&as --> Hash:D)
multi method categorize-list(@mapper*@list:&as --> Hash:D)

Populates a Hash by classifying the possibly-empty @list of values using the given mapper, optionally altering the values using the :&as Callable. The @list cannot be lazy.

The mapper can be a Callable that takes a single argument, an Associative, or an Iterable. With Associative and an Iterable mappers, the values in the @list represent the key and index of the mapper's value respectively. A Callable mapper will be executed once per each item in the @list, with that item as the argument and its return value will be used as the mapper's value.

Simple categorization

The mapper's value is expected to be a possibly empty list of non-Iterables that represent categories to place the value into:

say % .categorize-list: {
    gather {
        take 'prime'   if .is-prime;
        take 'largish' if $_ > 5;
        take $_ %% 2 ?? 'even' !! 'odd';
    }
}^10;
 
# OUTPUT: 
# { 
#     prime   => [2 3 5 7] 
#     even    => [0 2 4 6 8], 
#     odd     => [1 3 5 7 9], 
#     largish => [6 7 8 9], 
# }

Notice how some items, e.g. 6 and 7, are present in several categories.

Multi-level categorization

In multi-level categorization, the categories produced by the mapper can are Iterables and categorization combines features of classify, by producing nested hashes of classifications for each category.

say % .categorize-list: {
    [
        $_ > 5    ?? 'largish' !! 'smallish',
        .is-prime ?? 'prime'   !! 'non-prime',
    ],
}^10;
 
# OUTPUT: 
# { 
#     largish => { 
#         non-prime => [6 8 9], 
#         prime     => [7] 
#     }, 
#     smallish => { 
#         non-prime => [0 1 4], 
#         prime     => [2 3 5] 
#     } 
# }

The mapper in above snippet produces single-item list (note the significant trailing comma) with a two-item Array in it. The first item in that array indicates the first level of classification: the largish/smallish categories the routine produces. The second item in that array indicates further levels of classification, in our case the classification into prime/non-prime inside of each category.

NOTE: each of category Iterables must have the same number of elements, or the method will throw an exception. This restriction exists to avoid conflicts when the same key is a leaf of one value's classification but a node of another value's classification.

:&as value modifier

If :&as Callable argument is specified, it will be called once per each item of @list, with the value as the argument, and its return value will be used instead of the original @list's item:

say % .categorize-list: :as{"Value is $_"}{ $_ %% 2 ?? 'even' !! 'odd' }^5;
# OUTPUT (slightly altered manually, for clarity): 
# { 
#     even => ['Value is 0', 'Value is 2', 'Value is 4'], 
#     odd  => ['Value is 1', 'Value is 3'] 
# }

method push

Defined as:

multi method push(Hash:D: *@new)

Adds the @new elements to the hash with the same semantics as hash assignment, but with three exceptions:

Example:

my %h  = => 1;
%h.push: (=> 1);              # a => [1,1] 
%h.push: (=> 1xx 3 ;        # a => [1,1,1,1,1] 
%h.push: (=> 3);              # a => [1,1,1,1,1], b => 3 
%h.push('c' => 4);              # a => [1,1,1,1,1], b => 3, c => 4 
push %h'd' => 5;              # a => [1,1,1,1,1], b => 3, c => 4, d => 5

Please note that Pairs or colon pairs as arguments to push will be treated as extra named arguments and as such wont end up the Hash. The same applies to the sub push.

my %h .= push(=> 6);
push %h=> 7;
say %h.perl;
# OUTPUT: «{}␤»

Also note that push can be used as a replacement for assignment during hash initialization very useful ways. Take for instance the case of an inverted index:

my %wc = 'hash' => 323'pair' => 322'pipe' => 323;
(my %inv).push: %wc.invert;
say %inv;                     # OUTPUT: «{322 => pair, 323 => [pipe hash]}␤»

Note that such an initialization could also be written as

my %wc = 'hash' => 323'pair' => 322'pipe' => 323;
my %inv .= push: %wc.invert;

Note: Compared to append, push will add the given value as is, whereas append will slip it in:

my %ha = :a[42, ]; %ha.push: "a" => <a b c a>;
say %ha# OUTPUT: «{a => [42 (a b c a)]}␤» 
 
my %hb = :a[42, ]; %hb.append: "a" => <a b c a>;
say %hb# OUTPUT: «{a => [42 a b c a]}␤»

method append

Defined as:

method append(+@values)

Append the provided Pairs or even sized list to the Hash. If a key already exists, turn the existing value into an Array and push new value onto that Array. Please note that you can't mix even sized lists and lists of Pairs. Also, bare Pairs or colon pairs will be treated as named arguments to .append.

my %h = => 1;
%h.append('b'2'c'3);
%h.append( %(=> 4) );
say %h;
# OUTPUT: «{a => 1, b => 2, c => 3, d => 4}␤» 
%h.append('a'2);
# OUTPUT: «{{a => [1 2], b => 2, c => 3, d => 4}␤»

Note: Compared to push, append will slip in the given value, whereas push will add it as is:

my %hb = :a[42, ]; %hb.append: "a" => <a b c a>;
say %hb# OUTPUT: «{a => [42 a b c a]}␤» 
 
my %ha = :a[42, ]; %ha.push: "a" => <a b c a>;
say %ha# OUTPUT: «{a => [42 (a b c a)]}␤»

method default

Defined as:

method default()

Returns the default value of the invocant, i.e. the value which is returned when a non existing key is used to access an element in the Hash. Unless the Hash is declared as having a default value by using the is default trait the method returns the type object (Any).

my %h1 = 'apples' => 3'oranges' => 7;
say %h1.default;                                       # OUTPUT: «(Any)␤» 
say %h1{'bananas'};                                    # OUTPUT: «(Any)␤» 
 
my %h2 is default(1= 'apples' => 3'oranges' => 7;
say %h2.default;                                       # OUTPUT: «1␤» 
say %h2{'apples'} + %h2{'bananas'};                    # OUTPUT: «4␤»

method keyof

Defined as:

method keyof()

Returns the type constraint for the keys of the invocant. For normal hashes the method returns the coercion type (Str(Any)) while for non-string keys hashes the type used in the declaration of the Hash is returned.

my %h1 = 'apples' => 3'oranges' => 7;  # (no key type specified) 
say %h1.keyof;                           # OUTPUT: «(Str(Any))␤» 
 
my %h2{Str} = 'oranges' => 7;            # (keys must be of type Str) 
say %h2.keyof;                           # (Str) 
%h2{3} = 'apples';                       # throws exception 
CATCH { default { put .^name''.Str } };
# OUTPUT: «X::TypeCheck::Binding: Type check failed in binding to key; expected Str but got Int (3)␤» 
 
my %h3{Int};                             # (this time, keys must be of type Int) 
%h3{42} = 4096;
say %h3.keyof;                           # (Int)

method of

Defined as:

method of()

Returns the type constraint for the values of the invocant. By default, i.e., if no type constraint is given during declaration, the method returns (Mu).

my %h1 = 'apples' => 3'oranges' => 7;  # (no type constraint specified) 
say %h1.of;                              # OUTPUT: «(Mu)␤» 
 
my Int %h2 = 'oranges' => 7;             # (values must be of type Int) 
say %h2.of;                              # OUTPUT: «(Int)␤»

routine dynamic

Defined as:

method dynamic(--> Bool:D)

Returns True if the invocant has been declared with the is dynamic trait.

my %a;
say %a.dynamic;                          # OUTPUT: «False␤» 
 
my %b is dynamic;
say %b.dynamic;                          # OUTPUT: «True␤»

If you declare a variable with the * twigil is dynamic is implied.

my %*b;
say %*b.dynamic;                         # OUTPUT: «True␤»

Note that in the Scalar case you have to use the VAR method in order to get correct information.

my $s is dynamic = %('apples' => 5);
say $s.dynamic;                   # OUTPUT: «False␤»  (wrong, don't do this) 
say $s.VAR.dynamic;               # OUTPUT: «True␤»   (correct approach)

Subscript Adverbs

Some methods are implemented as adverbs on subscripts (consult the operators documentation for more information).

:exists

The adverb :exists returns Bool::True if a key exists in the Hash. If more than one key is supplied it returns a List of Bool.

my %h = => 1=> 2;
say %h<a>:exists;   # OUTPUT: «True␤» 
say %h<a b>:exists# OUTPUT: «(True True)␤»

:delete

Use :delete to remove a Pair from the Hash.

my %h = => 1;
say %h;         # OUTPUT: «{a => 1}␤» 
say %h.elems;   # OUTPUT: «1␤» 
 
%h<a>:delete;
say %h;         # OUTPUT: «{}␤» 
say %h.elems;   # OUTPUT: «0␤»

:p

The adverb :p returns a Pair or a List of Pair instead of just the value.

my %h = => 1=> 2;
say %h<a>:p;    # OUTPUT: «a => 1␤» 
say %h<a b>:p;  # OUTPUT: «(a => 1 b=> 2)␤»

:v and :k

The adverbs :v and :k return the key or value or a list thereof.

my %h = => 1=> 2;
say %h<a>:k;    # OUTPUT: «a␤» 
say %h<a b>:k;  # OUTPUT: «(a b)␤»

The adverb :kv returns a list of keys and values.

my %h = => 1=> 2=> 3;
say %h<a c>:kv;  # OUTPUT: «(a 1 c 3)␤»

You can also use the adverbs without knowing anything about the hash by using empty angle brackets in which case all the keys and values will be listed:

my %h1 = => 1;
my %h2 = => 1=> 2;
say %h1<>:k# OUTPUT: «(a)␤» 
say %h1<>:v# OUTPUT: «(1)␤» 
say %h2<>:k# OUTPUT: «(a b)␤» 
say %h2<>:v# OUTPUT: «(1 2)␤»

Type Graph

Type relations for Hash
perl6-type-graph Hash Hash Map Map Hash->Map Mu Mu Any Any Any->Mu Cool Cool Cool->Any Iterable Iterable Associative Associative Map->Cool Map->Iterable Map->Associative Stash Stash Stash->Hash

Expand above chart

Routines supplied by class Map

Hash inherits from class Map, which provides the following routines:

(Map) method new

Defined as:

method new(*@args)

Creates a new Map from a list of alternating keys and values, with the same semantics as described for hash assigning in the Hash documentation, except, for literal pair handling. To ensure pairs correctly get passed, add extra parentheses around all the arguments.

my %h = Map.new('a'1'b'2);
 
# WRONG: :b(2) interpreted as named argument 
say Map.new('a'1:b(2) ).keys# OUTPUT: «(a)␤» 
 
# RIGHT: :b(2) interpreted as part of Map's contents 
say Map.new( ('a'1:b(2)) ).keys# OUTPUT: «(a b)␤»

(Map) method elems

Defined as:

method elems(Map:D: --> Int:D)

Returns the number of pairs stored in the Map.

my %map = Map.new('a'1'b'2);
say %map.elems# OUTPUT: «2␤»

(Map) method ACCEPTS

Defined as:

multi method ACCEPTS(Map:D: Positional $topic)
multi method ACCEPTS(Map:D: Cool:D     $topic)
multi method ACCEPTS(Map:D: Regex      $topic)
multi method ACCEPTS(Map:D: Any        $topic)

Used in smartmatching if the right-hand side is an Map.

If the topic is list-like (Positional), returns True if any of the list elements exist as a key in the Map.

If the topic is of type Cool (strings, integers etc.), returns True if the topic exists as a key.

If the topic is a regex, returns True if any of the keys match the regex.

As a fallback, the topic is coerced to a list, and the Positional behavior is applied.

(Map) method gist

Defined as:

method gist(Map:D: --> Str:D)

Returns the string containing the "gist" of the Map, sorts the pairs and lists up to the first 100, appending an ellipsis if the Map has more than 100 pairs.

(Map) method keys

Defined as:

method keys(Map:D: --> Seq:D)

Returns a Seq of all keys in the Map.

my $m = Map.new('a' => (23), 'b' => 17);
say $m.keys# OUTPUT: «(a b)␤»

(Map) method values

Defined as:

method values(Map:D: --> Seq:D)

Returns a Seq of all values in the Map.

my $m = Map.new('a' => (23), 'b' => 17);
say $m.values# OUTPUT: «((2 3) 17)␤»

(Map) method pairs

Defined as:

method pairs(Map:D: --> Seq:D)

Returns a Seq of all pairs in the Map.

my $m = Map.new('a' => (23), 'b' => 17);
say $m.pairs# OUTPUT: «(a => (2 3) b => 17)␤»

(Map) method antipairs

Defined as:

method antipairs(Map:D: --> Seq:D)

Returns all keys and their respective values as a Seq of Pairs where the keys and values have been exchanged, i.e. the opposite of method pairs. Unlike the invert method, there is no attempt to expand list values into multiple pairs.

my $m = Map.new('a' => (23), 'b' => 17);
say $m.antipairs;                                  # OUTPUT: «((2 3) => a 17 => b)␤»

(Map) method invert

Defined as:

method invert(Map:D: --> Seq:D)

Returns all keys and their respective values as a Seq of Pairs where the keys and values have been exchanged. The difference between invert and antipairs is that invert expands list values into multiple pairs.

my $m = Map.new('a' => (23), 'b' => 17);
say $m.invert;                                    # OUTPUT: «(2 => a 3 => a 17 => b)␤»

(Map) method kv

Defined as:

method kv(Map:D: --> Seq:D)

Returns a Seq of keys and values interleaved.

Map.new('a'1'b'2).kv  # (a 1 b 2)

(Map) method list

Defined as:

method list(Map:D: --> List:D)

Returns a List of all keys and values in the Map.

my $m = Map.new('a' => (23), 'b' => 17);
say $m.list;                                      # OUTPUT: «(b => 17 a => (2 3))␤»

(Map) method sort

Defined as:

multi method sort(Map:D: --> Seq:D)

Returns a Seq of Pair objects, which are the pairs of the hash, sorted by key. Equivalent to %hash.sort: *.key

# These are equivalent: 
say Map.new(<c 3 a 1 b 2>).sort;        # OUTPUT: «(a => 1 b => 2 c => 3)␤» 
say Map.new(<c 3 a 1 b 2>).sort: *.key# OUTPUT: «(a => 1 b => 2 c => 3)␤»

See Any.sort for additional available candidates.

(Map) method Int

Defined as:

method Int(Map:D: --> Int:D)

Returns the number of pairs stored in the Map (same as .elems).

my $m = Map.new('a' => 2'b' => 17);
say $m.Int;                                       # OUTPUT: «2␤»

(Map) method Numeric

Defined as:

method Numeric(Map:D: --> Int:D)

Returns the number of pairs stored in the Map (same as .elems).

my $m = Map.new('a' => 2'b' => 17);
say $m.Numeric;                                   # OUTPUT: «2␤»

(Map) method Bool

Defined as:

method Bool(Map:D: --> Bool:D)

Returns True if the invocant contains at least one key/value pair.

my $m = Map.new('a' => 2'b' => 17);
say $m.Bool;                                      # OUTPUT: «True␤»

(Map) method Capture

Defined as:

method Capture(Map:D:)

Returns a Capture where each key, if any, has been converted to a named argument with the same value as it had in the original Map. The returned Capture will not contain any positional arguments.

my $map = Map.new('a' => 2'b' => 17);
my $capture = $map.Capture;
my-sub(|$capture);                                # RESULT: «2, 17» 
 
sub my-sub(:$a:$b{
    say "$a$b"
}

Routines supplied by class Cool

Hash inherits from class Cool, which provides the following routines:

(Cool) routine abs

Defined as:

sub abs(Numeric() $x)
method abs()

Coerces the invocant (or in the sub form, the argument) to Numeric and returns the absolute value (that is, a non-negative number).

say (-2).abs;       # OUTPUT: «2␤» 
say abs "6+8i";     # OUTPUT: «10␤»

(Cool) method conj

Defined as:

method conj()

Coerces the invocant to Numeric and returns the complex conjugate (that is, the number with the sign of the imaginary part negated).

say (1+2i).conj;        # OUTPUT: «1-2i␤»

(Cool) routine EVAL

Defined as:

method EVAL(*%_)

It calls the subroutine form with the invocant as the first argument, $code, passing along named args, if any.

(Cool) routine sqrt

Defined as:

sub sqrt(Numeric(Cool$x)
method sqrt()

Coerces the invocant to Numeric (or in the sub form, the argument) and returns the square root, that is, a non-negative number that, when multiplied with itself, produces the original number.

say 4.sqrt;             # OUTPUT: «2␤» 
say sqrt(2);            # OUTPUT: «1.4142135623731␤»

(Cool) method sign

Defined as:

method sign()

Coerces the invocant to Numeric and returns its sign, that is, 0 if the number is 0, 1 for positive and -1 for negative values.

say 6.sign;             # OUTPUT: «1␤» 
say (-6).sign;          # OUTPUT: «-1␤» 
say "0".sign;           # OUTPUT: «0␤»

(Cool) method rand

Defined as:

method rand()

Coerces the invocant to Num and returns a pseudo-random value between zero and the number.

say 1e5.rand;           # OUTPUT: «33128.495184283␤»

(Cool) routine sin

Defined as:

sub sin(Numeric(Cool))
method sin()

Coerces the invocant (or in the sub form, the argument) to Numeric, interprets it as radians, returns its sine.

say sin(0);             # OUTPUT: «0␤» 
say sin(pi/4);          # OUTPUT: «0.707106781186547␤» 
say sin(pi/2);          # OUTPUT: «1␤»

Note that Perl 6 is no computer algebra system, so sin(pi) typically does not produce an exact 0, but rather a very small floating-point number.

(Cool) routine asin

Defined as:

sub asin(Numeric(Cool))
method asin()

Coerces the invocant (or in the sub form, the argument) to Numeric, and returns its arc-sine in radians.

say 0.1.asin;               # OUTPUT: «0.10016742116156␤» 
say asin(0.1);              # OUTPUT: «0.10016742116156␤»

(Cool) routine cos

Defined as:

sub cos(Numeric(Cool))
method cos()

Coerces the invocant (or in sub form, the argument) to Numeric, interprets it as radians, returns its cosine.

say 0.cos;                  # OUTPUT: «1␤» 
say pi.cos;                 # OUTPUT: «-1␤» 
say cos(pi/2);              # OUTPUT: «6.12323399573677e-17␤»

(Cool) routine acos

Defined as:

sub acos(Numeric(Cool))
method acos()

Coerces the invocant (or in sub form, the argument) to Numeric, and returns its arc-cosine in radians.

say 1.acos;                 # OUTPUT: «0␤» 
say acos(-1);               # OUTPUT: «3.14159265358979␤»

(Cool) routine tan

Defined as:

sub tan(Numeric(Cool))
method tan()

Coerces the invocant (or in sub form, the argument) to Numeric, interprets it as radians, returns its tangent.

say tan(3);                 # OUTPUT: «-0.142546543074278␤» 
say 3.tan;                  # OUTPUT: «-0.142546543074278␤»

(Cool) routine atan

Defined as:

sub atan(Numeric(Cool))
method atan()

Coerces the invocant (or in sub form, the argument) to Numeric, and returns its arc-tangent in radians.

say atan(3);                # OUTPUT: «1.24904577239825␤» 
say 3.atan;                 # OUTPUT: «1.24904577239825␤»

(Cool) routine atan2

Defined as:

method atan2($y = 1e0)

Coerces self and argument to Numeric, using them to compute the two-argument arc-tangent in radians.

say 3.atan2;                # OUTPUT: «1.24904577239825␤» 
say ⅔.atan2(⅓);             # OUTPUT: «1.1071487177940904␤»

The first argument defaults to 1, so in the first case the function will return the angle θ in radians between a vector that goes from origin to the point (3, 1) and the x axis.

(Cool) routine sec

Defined as:

sub sec(Numeric(Cool))
method sec()

Coerces the invocant (or in sub form, its argument) to Numeric, interprets it as radians, returns its secant, that is, the reciprocal of its cosine.

say 45.sec;                 # OUTPUT: «1.90359440740442␤» 
say sec(45);                # OUTPUT: «1.90359440740442␤»

(Cool) routine asec

Defined as:

sub asec(Numeric(Cool))
method asec()

Coerces the invocant (or in sub form, its argument) to Numeric, and returns its arc-secant in radians.

say 1.asec;                 # OUTPUT: «0␤» 
say sqrt(2).asec;           # OUTPUT: «0.785398163397448␤»

(Cool) routine cosec

Defined as:

sub cosec(Numeric(Cool))
method cosec()

Coerces the invocant (or in sub form, its argument) to Numeric, interprets it as radians, returns its cosecant, that is, the reciprocal of its sine.

say 0.45.cosec;             # OUTPUT: «2.29903273150897␤» 
say cosec(0.45);            # OUTPUT: «2.29903273150897␤»

(Cool) routine acosec

Defined as:

sub acosec(Numeric(Cool))
method acosec()

Coerces the invocant (or in sub form, its argument) to Numeric, and returns its arc-cosecant in radians.

say 45.acosec;              # OUTPUT: «0.0222240516182672␤» 
say acosec(45)              # OUTPUT: «0.0222240516182672␤»

(Cool) routine cotan

Defined as:

sub cotan(Numeric(Cool))
method cotan()

Coerces the invocant (or in sub form, its argument) to Numeric, interprets it as radians, returns its cotangent, that is, the reciprocal of its tangent.

say 45.cotan;               # OUTPUT: «0.617369623783555␤» 
say cotan(45);              # OUTPUT: «0.617369623783555␤»

(Cool) routine acotan

Defined as:

sub acotan(Numeric(Cool))
method acotan()

Coerces the invocant (or in sub form, its argument) to Numeric, and returns its arc-cotangent in radians.

say 45.acotan;              # OUTPUT: «0.0222185653267191␤» 
say acotan(45)              # OUTPUT: «0.0222185653267191␤»

(Cool) routine sinh

Defined as:

sub sinh(Numeric(Cool))
method sinh()

Coerces the invocant (or in method form, its argument) to Numeric, and returns its Sine hyperbolicus.

say 1.sinh;                 # OUTPUT: «1.1752011936438␤» 
say sinh(1);                # OUTPUT: «1.1752011936438␤»

(Cool) routine asinh

Defined as:

sub asinh(Numeric(Cool))
method asinh()

Coerces the invocant (or in sub form, its argument) to Numeric, and returns its Inverse Sine hyperbolicus.

say 1.asinh;                # OUTPUT: «0.881373587019543␤» 
say asinh(1);               # OUTPUT: «0.881373587019543␤»

(Cool) routine cosh

Defined as:

sub cosh(Numeric(Cool))
method cosh()

Coerces the invocant (or in sub form, its argument) to Numeric, and returns its Cosine hyperbolicus.

say cosh(0.5);              # OUTPUT: «1.12762596520638␤»

(Cool) routine acosh

Defined as:

sub acosh(Numeric(Cool))
method acosh()

Coerces the invocant (or in sub form, its argument) to Numeric, and returns its Inverse Cosine hyperbolicus.

say acosh(45);              # OUTPUT: «4.4996861906715␤»

(Cool) routine tanh

Defined as:

sub tanh(Numeric(Cool))
method tanh()

Coerces the invocant (or in sub form, its argument) to Numeric, interprets it as radians and returns its Tangent hyperbolicus.

say tanh(0.5);              # OUTPUT: «0.46211715726001␤» 
say tanh(atanh(0.5));       # OUTPUT: «0.5␤»

(Cool) routine atanh

Defined as:

sub atanh(Numeric(Cool))
method atanh()

Coerces the invocant (or in sub form, its argument) to Numeric, and returns its Inverse tangent hyperbolicus.

say atanh(0.5);             # OUTPUT: «0.549306144334055␤»

(Cool) routine sech

Defined as:

sub sech(Numeric(Cool))
method sech()

Coerces the invocant (or in sub form, its argument) to Numeric, and returns its Secant hyperbolicus.

say 0.sech;                 # OUTPUT: «1␤»

(Cool) routine asech

Defined as:

sub asech(Numeric(Cool))
method asech()

Coerces the invocant (or in sub form, its argument) to Numeric, and returns its Inverse hyperbolic secant.

say 0.8.asech;              # OUTPUT: «0.693147180559945␤»

(Cool) routine cosech

Defined as:

sub cosech(Numeric(Cool))
method cosech()

Coerces the invocant (or in sub form, its argument) to Numeric, and returns its Hyperbolic cosecant.

say cosech(pi/2);           # OUTPUT: «0.434537208094696␤»

(Cool) routine acosech

Defined as:

sub acosech(Numeric(Cool))
method acosech()

Coerces the invocant (or in sub form, its argument) to Numeric, and returns its Inverse hyperbolic cosecant.

say acosech(4.5);           # OUTPUT: «0.220432720979802␤»

(Cool) routine cotanh

Defined as:

sub cotanh(Numeric(Cool))
method cotanh()

Coerces the invocant (or in sub form, its argument) to Numeric, and returns its Hyperbolic cotangent.

say cotanh(pi);             # OUTPUT: «1.00374187319732␤»

(Cool) routine acotanh

Defined as:

sub acotanh(Numeric(Cool))
method acotanh()

Coerces the invocant (or in sub form, its argument) to Numeric, and returns its Inverse hyperbolic cotangent.

say acotanh(2.5);           # OUTPUT: «0.423648930193602␤»

(Cool) routine cis

Defined as:

sub cis(Numeric(Cool))
method cis()

Coerces the invocant (or in sub form, its argument) to Numeric, and returns cos(argument) + i*sin(argument).

say cis(pi/4);              # OUTPUT: «0.707106781186548+0.707106781186547i␤»

(Cool) routine log

Defined as:

multi sub log(Numeric(Cool$numberNumeric(Cool$base?)
multi method log(Cool:D: Cool:D $base?)

Coerces the arguments (including the invocant in the method form) to Numeric, and returns its Logarithm to base $base, or to base e (Euler's Number) if no base was supplied (Natural logarithm). Returns NaN if $base is negative. Throws an exception if $base is 1.

say (e*e).log;              # OUTPUT: «2␤»

(Cool) routine log10

Defined as:

multi sub log10(Cool(Numeric))
multi method log10()

Coerces the invocant (or in the sub form, the invocant) to Numeric, and returns its Logarithm to base 10, that is, a number that approximately produces the original number when raised to the power of 10. Returns NaN for negative arguments and -Inf for 0.

say log10(1001);            # OUTPUT: «3.00043407747932␤»

(Cool) routine exp

Defined as:

multi sub exp(Cool:D $powCool:D $base?)
multi method exp(Cool:D: Cool:D $base?)

Coerces the arguments (including the invocant in the method from) to Numeric, and returns $base raised to the power of the first number. If no $base is supplied, e (Euler's Number) is used.

say 0.exp;      # OUTPUT: «1␤» 
say 1.exp;      # OUTPUT: «2.71828182845905␤» 
say 10.exp;     # OUTPUT: «22026.4657948067␤»

(Cool) method unpolar

Defined as:

method unpolar(Numeric(Cool))

Coerces the arguments (including the invocant in the method form) to Numeric, and returns a complex number from the given polar coordinates. The invocant (or the first argument in sub form) is the magnitude while the argument (i.e. the second argument in sub form) is the angle. The angle is assumed to be in radians.

say sqrt(2).unpolar(pi/4);      # OUTPUT: «1+1i␤»

(Cool) routine round

Defined as:

multi sub round(Numeric(Cool))
multi method round(Cool:D: $unit = 1)

Coerces the invocant (or in sub form, its argument) to Numeric, and rounds it to the unit of $unit. If $unit is 1, rounds to the nearest integer.

say 1.7.round;          # OUTPUT: «2␤» 
say 1.07.round(0.1);    # OUTPUT: «1.1␤» 
say 21.round(10);       # OUTPUT: «20␤»

Always rounds up if the number is at mid-point:

say (−.5 ).round;       # OUTPUT: «0␤» 
say ( .5 ).round;       # OUTPUT: «1␤» 
say (−.55).round(.1);   # OUTPUT: «-0.5␤» 
say ( .55).round(.1);   # OUTPUT: «0.6␤»

Pay attention to types when using this method, as ending up with the wrong type may affect the precision you seek to achieve. For Real types, the type of the result is the type of the argument (Complex argument gets coerced to Real, ending up a Num). If rounding a Complex, the result is Complex as well, regardless of the type of the argument.

9930972392403501.round(1)      .perl.say# OUTPUT: «9930972392403501␤» 
9930972392403501.round(1e0)    .perl.say# OUTPUT: «9.9309723924035e+15␤» 
9930972392403501.round(1e0).Int.perl.say# OUTPUT: «9930972392403500␤»

(Cool) routine floor

Defined as:

multi sub floor(Numeric(Cool))
multi method floor

Coerces the invocant (or in sub form, its argument) to Numeric, and rounds it downwards to the nearest integer.

say "1.99".floor;       # OUTPUT: «1␤» 
say "-1.9".floor;       # OUTPUT: «-2␤» 
say 0.floor;            # OUTPUT: «0␤»

(Cool) method fmt

Defined as:

method fmt($format = '%s')

Uses $format to return a formatted representation of the invocant; equivalent to calling sprintf with $format as format and the invocant as the second argument. The $format will be coerced to Stringy and defaults to '%s'.

For more information about formats strings, see sprintf.

say 11.fmt('This Int equals %03d');         # OUTPUT: «This Int equals 011␤» 
say '16'.fmt('Hexadecimal %x');             # OUTPUT: «Hexadecimal 10␤»

(Cool) routine ceiling

Defined as:

multi sub ceiling(Numeric(Cool))
multi method ceiling

Coerces the invocant (or in sub form, its argument) to Numeric, and rounds it upwards to the nearest integer.

say "1".ceiling;        # OUTPUT: «1␤» 
say "-0.9".ceiling;     # OUTPUT: «0␤» 
say "42.1".ceiling;     # OUTPUT: «43␤»

(Cool) routine truncate

Defined as:

multi sub truncate(Numeric(Cool))
multi method truncate()

Coerces the invocant (or in sub form, its argument) to Numeric, and rounds it towards zero.

say 1.2.truncate;       # OUTPUT: «1␤» 
say truncate -1.2;      # OUTPUT: «-1␤»

(Cool) routine ord

Defined as:

sub ord(Str(Cool))
method ord()

Coerces the invocant (or in sub form, its argument) to Str, and returns the Unicode code point number of the first code point.

say 'a'.ord;            # OUTPUT: «97␤»

The inverse operation is chr.

Mnemonic: returns an ordinal number

(Cool) method path

Defined as:

method path()

DEPRECATED. It's been deprecated as of the 6.d version. Will be removed in the next ones.

Stringifies the invocant and converts it to IO::Path object. Use the .IO method instead.

(Cool) routine chr

Defined as:

sub chr(Int(Cool))
method chr()

Coerces the invocant (or in sub form, its argument) to Int, interprets it as a Unicode code points, and returns a string made of that code point.

say '65'.chr;       # OUTPUT: «A␤»

The inverse operation is ord.

Mnemonic: turns an integer into a character.

(Cool) routine chars

Defined as:

multi sub chars(Cool $x)
multi sub chars(Str:D $x)
multi sub chars(str $x --> int)
method chars(--> Int:D)

Coerces the invocant (or in sub form, its argument) to Str, and returns the number of characters in the string. Please note that on the JVM, you currently get codepoints instead of graphemes.

say 'møp'.chars;    # OUTPUT: «3␤» 
say 'ã̷̠̬̊'.chars;     # OUTPUT: «1␤» 
say '👨‍👩‍👧‍👦🏿'.chars;    # OUTPUT: «1␤»

If the string is native, the number of chars will be also returned as a native int.

Graphemes are user visible characters. That is, this is what the user thinks of as a “character”.

Graphemes can contain more than one codepoint. Typically the number of graphemes and codepoints differs when Prepend or Extend characters are involved (also known as Combining characters), but there are many other cases when this may happen. Another example is \c[ZWJ] (Zero-width joiner).

You can check Grapheme_Cluster_Break property of a character in order to see how it is going to behave:

say ã̷̠̬̊.uniprops(Grapheme_Cluster_Break); # OUTPUT: «(Other Extend Extend Extend Extend)␤» 
say 👨‍👩‍👧‍👦🏿.uniprops(Grapheme_Cluster_Break); # OUTPUT: «(E_Base_GAZ ZWJ E_Base_GAZ ZWJ E_Base_GAZ ZWJ E_Base_GAZ E_Modifier)␤»

You can read more about graphemes in the Unicode Standard, which Perl 6 tightly follows, using a method called NFG, normal form graphemes for efficiently representing them.

(Cool) routine codes

Defined as:

sub codes(Str(Cool))
method codes()

Coerces the invocant (or in sub form, its argument) to Str, and returns the number of Unicode code points.

say 'møp'.codes;    # OUTPUT: «3␤»

The same result will be obtained with

say +'møp'.ords;    # OUTPUT: «3␤»

ords first obtains the actual codepoints, so there might be a difference in speed.

(Cool) routine flip

Defined as:

sub flip(Cool $s --> Str:D)
method flip()

Coerces the invocant (or in sub form, its argument) to Str, and returns a reversed version.

say 421.flip;       # OUTPUT: «124␤»

(Cool) routine trim

Defined as:

sub trim(Str(Cool))
method trim()

Coerces the invocant (or in sub form, its argument) to Str, and returns the string with both leading and trailing whitespace stripped.

my $stripped = '  abc '.trim;
say "<$stripped>";          # OUTPUT: «<abc>␤»

(Cool) routine trim-leading

Defined as:

sub trim-leading(Str(Cool))
method trim-leading()

Coerces the invocant (or in sub form, its argument) to Str, and returns the string with leading whitespace stripped.

my $stripped = '  abc '.trim-leading;
say "<$stripped>";          # OUTPUT: «<abc >␤»

(Cool) routine trim-trailing

Defined as:

sub trim-trailing(Str(Cool))
method trim-trailing()

Coerces the invocant (or in sub form, its argument) to Str, and returns the string with trailing whitespace stripped.

my $stripped = '  abc '.trim-trailing;
say "<$stripped>";          # OUTPUT: «<  abc>␤»

(Cool) routine lc

Defined as:

sub lc(Str(Cool))
method lc()

Coerces the invocant (or in sub form, its argument) to Str, and returns it case-folded to lower case.

say "ABC".lc;       # OUTPUT: «abc␤»

(Cool) routine uc

Defined as:

sub uc(Str(Cool))
method uc()

Coerces the invocant (or in sub form, its argument) to Str, and returns it case-folded to upper case (capital letters).

say "Abc".uc;       # OUTPUT: «ABC␤»

(Cool) routine fc

Defined as:

sub fc(Str(Cool))
method fc()

Coerces the invocant (or in sub form, its argument) to Str, and returns the result a Unicode "case fold" operation suitable for doing caseless string comparisons. (In general, the returned string is unlikely to be useful for any purpose other than comparison.)

say "groß".fc;       # OUTPUT: «gross␤»

(Cool) routine tc

Defined as:

sub tc(Str(Cool))
method tc()

Coerces the invocant (or in sub form, its argument) to Str, and returns it with the first letter case-folded to title case (or where not available, upper case).

say "abC".tc;       # OUTPUT: «AbC␤»

(Cool) routine tclc

Defined as:

sub tclc(Str(Cool))
method tclc()

Coerces the invocant (or in sub form, its argument) to Str, and returns it with the first letter case-folded to title case (or where not available, upper case), and the rest of the string case-folded to lower case.

say 'abC'.tclc;     # OUTPUT: «Abc␤»

(Cool) routine wordcase

Defined as:

sub wordcase(Str(Cool$input:&filter = &tclcMu :$where = True)
method wordcase(:&filter = &tclcMu :$where = True)

Coerces the invocant (or in sub form, the first argument) to Str, and filters each word that smartmatches against $where through the &filter. With the default filter (first character to upper case, rest to lower) and matcher (which accepts everything), this title-cases each word:

say "perl 6 programming".wordcase;      # OUTPUT: «Perl 6 Programming␤»

With a matcher:

say "have fun working on perl".wordcase(:where({ .chars > 3 }));
                                        # Have fun Working on Perl

With a customer filter too:

say "have fun working on perl".wordcase(:filter(&uc), :where({ .chars > 3 }));
                                        # HAVE fun WORKING on PERL

(Cool) routine samecase

Defined as:

sub samecase(Cool $stringCool $pattern)
method samecase(Cool:D: Cool $pattern)

Coerces the invocant (or in sub form, the first argument) to Str, and returns a copy of $string with case information for each individual character changed according to $pattern.

Note: The pattern string can contain three types of characters, i.e. uppercase, lowercase and caseless. For a given character in $pattern its case information determines the case of the corresponding character in the result.

If $string is longer than $pattern, the case information from the last character of $pattern is applied to the remaining characters of $string.

say "perL 6".samecase("A__a__"); # OUTPUT: «Perl 6␤» 
say "pERL 6".samecase("Ab");     # OUTPUT: «Perl 6␤»

(Cool) routine uniprop

Defined as:

multi sub uniprop(Str:D|c)
multi sub uniprop(Int:D $code)
multi sub uniprop(Int:D $codeStringy:D $propname)
multi method uniprop(|c)

Returns the unicode property of the first character. If no property is specified returns the General Category. Returns a Bool for Boolean properties. A uniprops routine can be used to get the property for every character in a string.

say 'a'.uniprop;               # OUTPUT: «Ll␤» 
say '1'.uniprop;               # OUTPUT: «Nd␤» 
say 'a'.uniprop('Alphabetic'); # OUTPUT: «True␤» 
say '1'.uniprop('Alphabetic'); # OUTPUT: «False␤»

(Cool) sub uniprops

Defined as:

sub uniprops(Str:D $strStringy:D $propname = "General_Category")

Interprets the invocant as a Str, and returns the unicode property for each character as a Seq. If no property is specified returns the General Category. Returns a Bool for Boolean properties. Similar to uniprop, but for each character in the passed string.

(Cool) routine uniname

Defined as:

sub uniname(Str(Cool--> Str)
method uniname(--> Str)

Interprets the invocant or first argument as a Str, and returns the Unicode codepoint name of the first codepoint of the first character. See uninames for a routine that works with multiple codepoints, and uniparse for the opposite direction.

# Camelia in Unicode 
say »ö«.uniname;
# OUTPUT: «"RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK"␤» 
say "Ḍ̇".uniname# Note, doesn't show "COMBINING DOT ABOVE" 
# OUTPUT: «"LATIN CAPITAL LETTER D WITH DOT BELOW"␤» 
 
# Find the char with the longest Unicode name. 
say (0..0x1FFFF).sort(*.uniname.chars)[*-1].chr.uniname;
# OUTPUT: ««ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM␤»␤»

(Cool) routine uninames

Defined as:

sub uninames(Str:D)
method uninames()

Returns of a Seq of Unicode names for the all the codepoints in the Str provided.

say »ö«.uninames.perl;
# OUTPUT: «("RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK", "LATIN SMALL LETTER O WITH DIAERESIS", "LEFT-POINTING DOUBLE ANGLE QUOTATION MARK").Seq␤»

Note this example, which gets a Seq where each element is a Seq of all the codepoints in that character.

say "Ḍ̇'oh".comb>>.uninames.perl;
# OUTPUT: «(("LATIN CAPITAL LETTER D WITH DOT BELOW", "COMBINING DOT ABOVE").Seq, ("APOSTROPHE",).Seq, ("LATIN SMALL LETTER O",).Seq, ("LATIN SMALL LETTER H",).Seq)␤»

See uniparse for the opposite direction.

(Cool) routine unimatch

Defined as:

multi sub unimatch(Str:D $str|c)
multi unimatch(Int:D $codeStringy:D $pvalnameStringy:D $propname = $pvalname)

Checks if the given integer codepoint or the first letter of the string given have a unicode property equal to the value you give. If you supply the Unicode property to be checked it will only return True if that property matches the given value.

say unimatch 'A''Latin';           # OUTPUT: «True␤» 
say unimatch 'A''Latin''Script'# OUTPUT: «True␤» 
say unimatch 'A''Ll';              # OUTPUT: «True␤»

(Cool) routine chop

Defined as:

sub chop(Str(Cool))
method chop()

Coerces the invocant (or in sub form, its argument) to Str, and returns it with the last character removed.

say 'perl'.chop;                        # OUTPUT: «per␤»

(Cool) routine chomp

Defined as:

sub chomp(Str(Cool))
method chomp()

Coerces the invocant (or in sub form, its argument) to Str, and returns it with the last character removed, if it is a logical newline.

say 'ab'.chomp.chars;                   # OUTPUT: «2␤» 
say "a\n".chomp.chars;                  # OUTPUT: «1␤»

(Cool) routine substr

Defined as:

sub substr(Str(Cool$str|c)
method substr(|c)

Coerces the invocant (or in the sub form, the first argument) to Str, and calls Str.substr with the arguments.

(Cool) routine substr-rw

Defined as:

multi method substr-rw(|) is rw
multi sub substr-rw(|) is rw

Coerces the invocant (or in the sub form, the first argument) to Str, and calls Str.substr-rw with the arguments.

(Cool) routine ords

Defined as:

sub ords(Str(Cool$str)
method ords()

Coerces the invocant (or in the sub form, the first argument) to Str, and returns a list of Unicode codepoints for each character.

say "Camelia".ords;              # OUTPUT: «67 97 109 101 108 105 97␤» 
say ords 10;                     # OUTPUT: «49 48␤»

This is the list-returning version of ord. The inverse operation in chrs. If you are only interested in the number of codepoints, codes is a possibly faster option.

(Cool) routine chrs

Defined as:

sub chrs(*@codepoints --> Str:D)
method chrs()

Coerces the invocant (or in the sub form, the argument list) to a list of integers, and returns the string created by interpreting each integer as a Unicode codepoint, and joining the characters.

say <67 97 109 101 108 105 97>.chrs;   # OUTPUT: «Camelia␤»

This is the list-input version of chr. The inverse operation is ords.

(Cool) routine split

Defined as:

multi sub    split(  Str:D $delimiterStr(Cool$input$limit = Inf:$k:$v:$kv:$p:$skip-empty)
multi sub    split(Regex:D $delimiterStr(Cool$input$limit = Inf:$k:$v:$kv:$p:$skip-empty)
multi sub    split(@delimitersStr(Cool$input$limit = Inf:$k:$v:$kv:$p:$skip-empty)
multi method split(  Str:D $delimiter$limit = Inf:$k:$v:$kv:$p:$skip-empty)
multi method split(Regex:D $delimiter$limit = Inf:$k:$v:$kv:$p:$skip-empty)
multi method split(@delimiters$limit = Inf:$k:$v:$kv:$p:$skip-empty)

[1]

Coerces the invocant (or in the sub form, the second argument) to Str, and splits it into pieces based on delimiters found in the string.

If $delimiter is a string, it is searched for literally and not treated as a regex. You can also provide multiple delimiters by specifying them as a list; mixing Cool and Regex objects is OK.

say split(';'"a;b;c").perl;               # OUTPUT: «("a", "b", "c")␤» 
say split(';'"a;b;c"2).perl;            # OUTPUT: «("a", "b;c").Seq␤» 
 
say split(';'"a;b;c,d").perl;             # OUTPUT: «("a", "b", "c,d")␤» 
say split(/\;/"a;b;c,d").perl;            # OUTPUT: «("a", "b", "c,d")␤» 
say split(/<[;,]>/"a;b;c,d").perl;        # OUTPUT: «("a", "b", "c", "d")␤» 
 
say split(['a', /b+/4], '1a2bb345').perl# OUTPUT: «("1", "2", "3", "5")␤»

By default, split omits the matches, and returns a list of only those parts of the string that did not match. Specifying one of the :k, :v, :kv, :p adverbs changes that. Think of the matches as a list that is interleaved with the non-matching parts.

The :v interleaves the values of that list, which will be either Match objects, if a Regex was used as a matcher in the split, or Str objects, if a Cool was used as matcher. If multiple delimiters are specified, Match objects will be generated for all of them, unless all of the delimiters are Cool.

say 'abc'.split(/b/:v);               # OUTPUT: «(a 「b」 c)␤» 
say 'abc'.split('b':v);               # OUTPUT: «(a b c)␤»

:k interleaves the keys, that is, the indexes:

say 'abc'.split(/b/:k);               # OUTPUT: «(a 0 c)␤»

:kv adds both indexes and matches:

say 'abc'.split(/b/:kv);               # OUTPUT: «(a 0 「b」 c)␤»

and :p adds them as Pairs, using the same types for values as :v does:

say 'abc'.split(/b/:p);               # OUTPUT: «(a 0 => 「b」 c)␤» 
say 'abc'.split('b':p);               # OUTPUT: «(a 0 => b c)␤»

You can only use one of the :k, :v, :kv, :p adverbs in a single call to split.

Note that empty chunks are not removed from the result list. For that behavior, use the :skip-empty named argument:

say ("f,,b,c,d".split: /","/             ).perl;  # OUTPUT: «("f", "", "b", "c", "d")␤» 
say ("f,,b,c,d".split: /","/:skip-empty).perl;  # OUTPUT: «("f", "b", "c", "d")␤»

(Cool) routine lines

Defined as:

sub lines(Str(Cool))
method lines()

Coerces the invocant (and in sub form, the argument) to Str, decomposes it into lines (with the newline characters stripped), and returns the list of lines.

say lines("a\nb\n").join('|');          # OUTPUT: «a|b␤» 
say "some\nmore\nlines".lines.elems;    # OUTPUT: «3␤»

This method can be used as part of an IO::Path to process a file line-by-line, since IO::Path objects inherit from Cool, e.g.:

for 'huge-csv'.IO.lines -> $line {
    # Do something with $line 
}
 
# or if you'll be processing later 
my @lines = 'huge-csv'.IO.lines;

Without any arguments, sub lines operates on $*ARGFILES, which defaults to $*IN in the absence of any filenames.

To modify values in place use is copy to force a writable container.

for $*IN.lines -> $_ is copy { s/(\w+)/{$0 ~ $0}/.say }

(Cool) method words

Defined as:

method words(Cool:D: |c)

Coerces the invocant (or first argument, if it is called as a subroutine) to Str, and returns a list of words that make up the string. Check Str.words for additional arguments and its meaning.

say <The quick brown fox>.words.join('|');     # OUTPUT: «The|quick|brown|fox␤» 
say <The quick brown fox>.words(2).join('|');  # OUTPUT: «The|quick␤» 

Cool is the base class for many other classes, and some of them, like Match, can be converted to a string. This is what happens in this case:

say ( "easy come, easy goes" ~~ m:g/(ea\w+)/).words(Inf);
# OUTPUT: «(easy easy)␤» 
say words"easy come, easy goes" ~~ m:g/(ea\w+)/ , ∞);
# OUTPUT: «(easy easy)␤»

The example above illustrates two of the ways words can be invoked, with the first argument turned into invocant by its signature. Of course, Inf is the default value of the second argument, so in both cases (and forms) it can be simply omitted.

Only whitespace (including no-break space) counts as word boundaries

say <Don't we ♥ Perl 6>.words.join('|');  # OUTPUT: «Don't|we|♥|Perl|6␤»

In this case, Perl 6 includes an (visible only in the source) no-break space; words still splits the (resulting) Str on it, even if the original array only had 4 elements:

say <Don't we ♥ Perl 6>.join("|");  # OUTPUT: «Don't|we|♥|Perl 6␤»

Please see Str.words for more examples and ways to invoke it.

(Cool) routine comb

Defined as:

multi sub comb(Regex $matcherCool $input$limit = *)
multi sub comb(Str $matcherCool $input$limit = *)
multi sub comb(Int:D $sizeCool $input$limit = *)
multi method comb(|c)

Returns a Seq of all (or if supplied, at most $limit) matches of the invocant (method form) or the second argument (sub form) against the Regex, string or defined number.

say "6 or 12".comb(/\d+/).join("");           # OUTPUT: «6, 12␤» 
say comb(/\d <[1..9]> /,(11..30)).join("--");
# OUTPUT: 
# «11--12--13--14--15--16--17--18--19--21--22--23--24--25--26--27--28--29␤»

The second statement exemplifies the first form of comb, with a Regex that excludes multiples of ten, and a Range (which is Cool) as $input. comb stringifies the Range before applying .comb on the resulting string. Check Str.comb for its effect on different kind of input strings. When the first argument is an integer, it indicates the (maximum) size of the chunks the input is going to be divided in

say comb(3,[3,33,333,3333]).join("*");  # OUTPUT: «3 3*3 3*33 *333*3␤»

In this case the input is a list, which after transformation to Str (which includes the spaces) is divided in chunks of size 3.

(Cool) method contains

Defined as:

method contains(Cool:D: |c)

Coerces the invocant Str, and calls Str.contains on it. Please refer to that version of the method for arguments and general syntax.

say 123.contains("2")# OUTPUT: «True␤»

Since Int is a subclass of Cool, 123 is coerced to a Str and then contains is called on it.

say (1,1* + * … * > 250).contains(233)# OUTPUT: «True␤»

Seqs are also subclasses of Cool, and they are stringified to a comma-separated form. In this case we are also using an Int, which is going to be stringified also; "233" is included in that sequence, so it returns True. Please note that this sequence is not lazy; the stringification of lazy sequences does not include each and every one of their components for obvious reasons.

(Cool) routine index

Defined as:

multi sub index(Cool $sCool $needleCool $pos = 0)
method    index(Cool:D: |c)

Coerces the first two arguments (in method form, also counting the invocant) to a Str, and searches for $needle in the string $s starting from $startpos. It returns the offset into the string where $needle was found, and an undefined value if it was not found.

See the documentation in type Str for examples.

(Cool) routine rindex

Defined as:

multi sub    rindex(Str(Cool$haystackStr(Cool$needleInt(Cool$startpos = $haystack.chars)
multi method rindex(Str(Cool$haystack: Str(Cool$needleInt(Cool$startpos = $haystack.chars)

Coerces the first two arguments (including the invocant in method form) to Str and $startpos to Int, and returns the last position of $needle in $haystack not after $startpos. Returns an undefined value if $needle wasn't found.

See the documentation in type Str for examples.

(Cool) method match

Defined as:

multi method match(Cool:D: $target*%adverbs)

Coerces the invocant to Str and calls the method match on it.

(Cool) routine roots

Defined as:

multi sub roots(Numeric(Cool$xInt(Cool$n)
multi method roots(Int(Cool$n)

Coerces the first argument (and in method form, the invocant) to Numeric and the second ($n) to Int, and produces a list of $n Complex $n-roots, which means numbers that, raised to the $nth power, approximately produce the original number.

For example

my $original = 16;
my @roots = $original.roots(4);
say @roots;
 
for @roots -> $r {
    say abs($r ** 4 - $original);
}
 
# OUTPUT:«2+0i 1.22464679914735e-16+2i -2+2.44929359829471e-16i -3.67394039744206e-16-2i␤» 
# OUTPUT:«1.77635683940025e-15␤» 
# OUTPUT:«4.30267170434156e-15␤» 
# OUTPUT:«8.03651692704705e-15␤» 
# OUTPUT:«1.04441561648202e-14␤» 

(Cool) method match

Defined as:

method match(|)

Coerces the invocant to Stringy and calls Str.match.

(Cool) method subst

Defined as:

method subst(|)

Coerces the invocant to Stringy and calls Str.subst.

(Cool) method trans

Defined as:

method trans(|)

Coerces the invocant to Str and calls Str.trans

(Cool) method IO

Defined as:

method IO(--> IO::Path:D)

Coerces the invocant to IO::Path.

.say for '.'.IO.dir;        # gives a directory listing 

Routines supplied by role Iterable

Hash inherits from class Map, which does role Iterable, which provides the following routines:

(Iterable) method iterator

Defined as:

method iterator(--> Iterator:D)

Method stub that ensures all classes doing the Iterable role have a method iterator.

It is supposed to return an Iterator.

say (1..10).iterator;

(Iterable) method flat

Defined as:

method flat(--> Iterable)

Returns another Iterable that flattens out all iterables that the first one returns.

For example

say (<a b>'c').elems;         # OUTPUT: «2␤» 
say (<a b>'c').flat.elems;    # OUTPUT: «3␤»

because <a b> is a List and thus iterable, so (<a b>, 'c').flat returns ('a', 'b', 'c'), which has three elems.

Note that the flattening is recursive, so ((("a", "b"), "c"), "d").flat returns ("a", "b", "c", "d"), but it does not flatten itemized sublists:

say ($('a''b'), 'c').perl;    # OUTPUT: «($("a", "b"), "c")␤»

(Iterable) method lazy

Defined as:

method lazy(--> Iterable)

Returns a lazy iterable wrapping the invocant.

say (1 ... 1000).is-lazy;      # OUTPUT: «False␤» 
say (1 ... 1000).lazy.is-lazy# OUTPUT: «True␤»

(Iterable) method hyper

Defined as:

method hyper(Int(Cool:$batch = 64Int(Cool:$degree = 4)

Returns another Iterable that is potentially iterated in parallel, with a given batch size and degree of parallelism.

The order of elements is preserved.

say ([1..100].hyper.map({ $_ +1 }).list);

Use hyper in situations where it is OK to do the processing of items in parallel, and the output order should be kept relative to the input order. See race for situations where items are processed in parallel and the output order does not matter.

Options degree and batch

The degree option (short for "degree of parallelism") configures how many parallel workers should be started. To start 4 workers (e.g. to use at most 4 cores), pass :4degree to the hyper or race method. Note that in some cases, choosing a degree higher than the available CPU cores can make sense, for example I/O bound work or latency-heavy tasks like web crawling. For CPU-bound work, however, it makes no sense to pick a number higher than the CPU core count.

The batch size option configures the number of items sent to a given parallel worker at once. It allows for making a throughput/latency trade-off. If, for example, an operation is long-running per item, and you need the first results as soon as possible, set it to 1. That means every parallel worker gets 1 item to process at a time, and reports the result as soon as possible. In consequence, the overhead for inter-thread communication is maximized. In the other extreme, if you have 1000 items to process and 10 workers, and you give every worker a batch of 100 items, you will incur minimal overhead for dispatching the items, but you will only get the first results when 100 items are processed by the fastest worker (or, for hyper, when the worker getting the first batch returns.) Also, if not all items take the same amount of time to process, you might run into the situation where some workers are already done and sit around without being able to help with the remaining work. In situations where not all items take the same time to process, and you don't want too much inter-thread communication overhead, picking a number somewhere in the middle makes sense. Your aim might be to keep all workers about evenly busy to make best use of the resources available.

You can also check out this blog post on the semantics of hyper and race

(Iterable) method race

Defined as:

method race(Int(Cool:$batch = 64Int(Cool:$degree = 4 --> Iterable)

Returns another Iterable that is potentially iterated in parallel, with a given batch size and degree of parallelism (number of parallel workers).

Unlike hyper, race does not preserve the order of elements.

say ([1..100].race.map({ $_ +1 }).list);

Use race in situations where it is OK to do the processing of items in parallel, and the output order does not matter. See hyper for situations where you want items processed in parallel and the output order should be kept relative to the input order.

Blog post on the semantics of hyper and race

See hyper for an explanation of :$batch and :$degree.

Routines supplied by role Associative

Hash inherits from class Map, which does role Associative, which provides the following routines:

(Associative) method of

Defined as:

method of()

Associative is actually a parameterized role which can use different classes for keys and values. As seen at the top of the document, by default it coerces to Str for the key and uses a very generic Mu for value.

my %any-hash;
say %any-hash.of;#  OUTPUT: «(Mu)␤»

The value is the first parameter you use when instantiating Associative with particular classes:

class DateHash is Hash does Associative[Cool,DateTime{};
my %date-hash := DateHash.new;
say %date-hash.of# OUTPUT: «(Cool)␤»

(Associative) method keyof

Defined as:

method keyof()

Returns the parameterized key used for the Associative role, which is Any coerced to Str by default. This is the class used as second parameter when you use the parameterized version of Associative.

my %any-hash;
%any-hash.keyof#OUTPUT: «(Str(Any))␤»

(Associative) method AT-KEY

method AT-KEY(\key)

Should return the value / container at the given key.

(Associative) method EXISTS-KEY

method EXISTS-KEY(\key)

Should return a Bool indicating whether the given key actually has a value.

(Associative) method STORE

method STORE(\values:$initialize)

This method should only be supplied if you want to support the:

my %h is Foo = => 42=> 666;

syntax for binding your implementation of the Associative role.

Should accept the values to (re-)initialize the object with, which either could consist of Pairs, or separate key/value pairs. The optional named parameter will contain a True value when the method is called on the object for the first time. Should return the invocant.