# class Str

String of characters

```
class Str is Cool does Stringy { }
```

Built-in class for strings. Objects of type `Str`

are immutable.

# Methods

## routine chop

```
multi sub chop(Str:D) returns Str:D
multi method chop(Str:D: $chars = 1) returns Str:D
```

Returns the string with `$chars`

characters removed from the end.

## routine chomp

```
multi sub chomp(Str:D ) returns Str:D
multi method chomp(Str:D:) returns Str:D
```

Returns the string with a logical newline removed from the end.

## routine lc

```
multi sub lc(Str:D ) returns Str:D
multi method lc(Str:D:) returns Str:D
```

Returns a lower-case version of the string.

## routine uc

```
multi sub uc(Str:D ) returns Str:D
multi method uc(Str:D:) returns Str:D
```

Returns an uppercase version of the string.

## routine fc

```
multi sub fc(Str:D ) returns Str:D
multi method fc(Str:D:) returns Str:D
```

Does a Unicode "fold case" operation suitable for doing caseless string comparisons. (In general, the returned string is unlikely to be useful for any purpose other than comparison.)

(Not implemented in Rakudo and Niecza)

## routine tc

```
multi sub tc(Str:D ) returns Str:D
multi method tc(Str:D:) returns Str:D
```

Does a Unicode "titlecase" operation, that is changes the first character in the string to title case, or to upper case if the character has no title case mapping

(Not implemented in Niecza)

## routine tclc

```
multi sub tclc(Str:D ) returns Str:D
multi method tclc(Str:D:) returns Str:D
```

Turns the first character to title case, and all other characters to lower case

(not implemented in Niecza)

## routine tcuc

```
multi sub tcuc(Str:D ) returns Str:D
multi method tcuc(Str:D:) returns Str:D
```

Turns the first character to title case, and all other characters to upper case

(Not implemented in Rakudo and Niecza)

## routine wordcase

multi sub wordcase(Cool $x) returns Str multi sub wordcase(Str:D $x) returns Str multi method wordcase(Str:D: :&filter = &tclc, Mu :$where = True) returns Str

Returns a string in which `&filter`

has been applied to all the words that match `$where`

. By default, this means that the first letter of every word is capitalized, and all the other letters lowercased.

## method lcfirst

Perl 6 does not have a `lcfirst`

function.

## method ucfirst

Perl 6 does not have a `ucfirst`

function. See tc.

## method length

Perl 6 does not have a `length`

function. See chars or elems.

## routine chars

```
multi sub chars(Cool $x) returns Int:D
multi sub chars(Str:D $x) returns Int:D
multi sub chars(str $x) returns int
multi method chars(Str:D:) returns Int:D
```

Returns the number of characters in the string in the current (lexically scoped) idea of what a normal character is, usually graphemes.

## method encode

```
multi method encode(Str:D: $encoding = $?ENC, $nf = $?NF) returns Buf
```

Returns a Buf which represents the original string in the given encoding and normal form. The actual return type is as specific as possible, so `$str.encode('UTF-8')`

returns a `utf8`

object, `$str.encode('ISO-8859-1')`

a `buf8`

.

## routine index

```
multi sub index(Cool $s, Str:D $needle, Cool $startpos = 0) returns Int
multi method index(Cool $needle, Cool $startpos = 0) returns Int
```

Searches for `$needle`

in the string starting from `$startpos`

. It returns the offset into the string where `$needle`

was found, and an undefined value if it was not found.

Examples:

```
say index "Camelia is a butterfly", "a"; # 1
say index "Camelia is a butterfly", "a", 2; # 6
say index "Camelia is a butterfly", "er"; # 17
say index "Camelia is a butterfly", "Camel"; # 0
say index "Camelia is a butterfly", "Onion"; # Int()
say index("Camelia is a butterfly", "Onion").defined ?? 'OK' !! 'NOT'; # NOT
```

## routine rindex

```
multi sub rindex(Str:D $haystack, Str:D $needle, Int $startpos = $haystack.chars) returns StrPos
multi method rindex(Str:D $haystack: Str:D $needle, Int $startpos = $haystack.chars) returns StrPos
```

Returns the last position of `$needle`

in `$haystack`

not after `$startpos`

. Returns an undefined value if `$needle`

wasn't found.

Examples:

```
say rindex "Camelia is a butterfly", "a"; # 11
say rindex "Camelia is a butterfly", "a", 10; # 6
```

## routine split

```
multi sub split( Str:D $delimiter, Str:D $input, $limit = Inf, :$all) returns Positional
multi sub split(Regex:D $delimiter, Str:D $input, $limit = Inf, :$all) returns Positional
multi method split(Str:D $input: Str:D $delimiter, $limit = Inf, :$all) returns Positional
multi method split(Str:D $input: Regex:D $delimiter, $limit = Inf, :$all) returns Positional
```

Splits a string up 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.

If the named parameter `:all`

is passed, the matches from `$delimiter`

are included in the result list.

Note that unlike in Perl 5, empty chunks are not removed from the result list. If you want that behavior, consider using comb instead.

Examples:

```
say split(';', "a;b;c").perl; # ("a", "b", "c").list
say split(';', "a;b;c", :all).perl; # (("a", ";"), ("b", ";"), "c").list
say split(';', "a;b;c", 2).perl; # ("a", "b;c").list
say split(';', "a;b;c", 2, :all).perl; # (("a", ";"), "b;c").list
say split(';', "a;b;c,d").perl; # ("a", "b", "c,d").list
say split(/\;/, "a;b;c,d").perl; # ("a", "b", "c,d").list
say split(/<[;,]>/, "a;b;c,d").perl; # ("a", "b", "c", "d").list
```

## routine comb

```
multi sub comb(Str:D $matcher, Str:D $input, $limit = Inf, Bool :$match)
multi sub comb(Regex:D $matcher, Str:D $input, $limit = Inf, Bool :$match)
multi method comb(Str:D $input:)
multi method comb(Str:D $input: Str:D $matcher, $limit = Inf, Bool :$match)
multi method comb(Str:D $input: Regex:D $matcher, $limit = Inf, Bool :$match)
```

Searches for `$matcher`

in `$input`

and returns a list of all matches (as `Str`

by default, or as Match if `$match`

is True), limited to at most `$limit`

matches.

If no matcher is supplied, a list of characters in the string (e.g. `$matcher = rx/./`

) is returned.

Examples:

```
comb(/\w/, "a;b;c").perl; # ("a", "b", "c").list
comb(/\N/, "a;b;c").perl; # ("a", ";", "b", ";", "c").list
comb(/\w/, "a;b;c", 2).perl; # ("a", "b").list
comb(/\w\;\w/, "a;b;c", 2).perl; # ("a;b",).list
```

## routine lines

```
multi sub lines(Str:D $input, $limit = Inf) returns Positional
multi method lines(Str:D $input: $limit = Inf) returns Positional
```

Returns a list of lines (without trailing newline characters), i.e. the same as a call to `$input.comb( / ^^ \N* /, $limit )`

would.

Examples:

```
lines("a\nb").perl; # ("a", "b").list
lines("a\nb").elems; # 2
"a\nb".lines.elems; # 2
"a\n".lines.elems; # 1
```

## routine words

```
multi sub words(Str:D $input, $limit = Inf) returns Positional
multi method words(Str:D $input: $limit = Inf) returns Positional
```

Returns a list of non-whitespace bits, i.e. the same as a call to `$input.comb( / \S+ /, $limit )`

would.

Examples:

```
"a\nb\n".words.perl; # ("a", "b").list
"hello world".words.perl; # ("hello", "world").list
"foo:bar".words.perl; # ("foo:bar",).list
"foo:bar\tbaz".words.perl; # ("foo:bar", "baz").list
```

## routine flip

```
multi sub flip(Str:D ) returns Str:D
multi method flip(Str:D:) returns Str:D
```

Returns the string reversed character by character.

Examples:

```
"Perl".flip; # lreP
"ABBA".flip; # ABBA
```

## sub sprintf

```
multi sub sprintf ( Str:D $format, *@args) returns Str:D
```

This function is mostly identical to the C library sprintf function.

The `$format`

is scanned for `%`

characters. Any `%`

introduces a format token. Format tokens have the following grammar:

```
grammar Str::SprintfFormat {
regex format_token { '%': <index>? <precision>? <modifier>? <directive> }
token index { \d+ '$' }
token precision { <flags>? <vector>? <precision_count> }
token flags { <[ \x20 + 0 \# \- ]>+ }
token precision_count { [ <[1..9]>\d* | '*' ]? [ '.' [ \d* | '*' ] ]? }
token vector { '*'? v }
token modifier { < ll l h V q L > }
token directive { < % c s d u o x e f g X E G b p n i D U O F > }
}
```

Directives guide the use (if any) of the arguments. When a directive (other than `%`

) is used, it indicates how the next argument passed is to be formatted into the string.

The directives are:

% | a literal percent sign |

c | a character with the given codepoint |

s | a string |

d | a signed integer, in decimal |

u | an unsigned integer, in decimal |

o | an unsigned integer, in octal |

x | an unsigned integer, in hexadecimal |

e | a floating-point number, in scientific notation |

f | a floating-point number, in fixed decimal notation |

g | a floating-point number, in %e or %f notation |

X | like x, but using uppercase letters |

E | like e, but using an uppercase "E" |

G | like g, but with an uppercase "E" (if applicable) |

b | an unsigned integer, in binary |

Compatibility:

i | a synonym for %d |

D | a synonym for %ld |

U | a synonym for %lu |

O | a synonym for %lo |

F | a synonym for %f |

Perl 5 (non-)compatibility:

n | produces a runtime exception |

p | produces a runtime exception |

Modifiers change the meaning of format directives, but are largely no-ops (the semantics are still being determined).

h interpret integer as native "short" (typically int16) |

l interpret integer as native "long" (typically int32 or int64) |

ll interpret integer as native "long long" (typically int64) |

L interpret integer as native "long long" (typically uint64) |

q interpret integer as native "quads" (typically int64 or larger) |

Examples:

```
sprintf "%ld a big number, %lld a bigger number\n", 4294967295, 4294967296;
```

Special case: sprintf("<b>%s</b>\n", "Perl 6") will not work use either of the following:

```
sprintf Q:b "<b>%s</b>\n", "Perl 6";
sprintf "<b>\%s</b>\n", "Perl 6";
sprintf "<b>%s\</b>\n", "Perl 6";
```

## method subst

```
multi method subst(Str:D: $matcher, $replacement, *%opts)
```

Returns the invocant string where `$matcher`

is replaced by `$replacement`

(or the original string, if no match was found).

There is an in-place syntactic variant of `subst`

spelled `s/matcher/replacement`

.

`$matcher`

an be a Regex, or a literal `Str`

. Non-Str matcher arguments of type Cool are coerced to to `Str`

for literal matching.

```
my $some-string = "Some foo";
my $another-string = $some-string.subst(/foo/, "string"); # gives 'Some string'
$some-string.=subst(/foo/, "string"); # in-place substitution. $some-string is now 'Some string'
```

The replacement can be a closure:

```
my $i = 41;
my $str = "The answer is secret.";
my $real-answer = $str.subst(/secret/, {++$i}); # The answer to everything
```

Here are other examples of usage:

```
my $str = "Hey foo foo foo";
$str.subst(/foo/, "bar", :g); # global substitution - returns Hey bar bar bar
$str.subst(/foo/, "no subst", :x(0)); # targeted substitution. Number of times to substitute. Returns back unmodified.
$str.subst(/foo/, "bar", :x(1)); #replace just the first occurrence.
$str.subst(/foo/, "bar", :nth(3)); # replace nth match alone. Replaces the third foo. Returns Hey foo foo bar
```

The following adverbs are supported

short | long | meaning |
---|---|---|

:g | :global | tries to match as often as possible |

:nth(Int) | only substitute the nth's match | |

:ss | :samespace | preserves whitespace on substitution |

:ii | :samecase | preserves case on substitution |

:x(Int) | substitute exactly $x matches |

Note that only in the `s///`

form `:ii`

implies `:i`

and `:ss`

implies `:s`

. In the method form, the `:s`

and `:i`

modifiers must be added to the regex, not the `subst`

method call.

## routine substr

```
multi sub substr(Str:D $s, Int:D $from, Int:D $chars = $s.chars - $from) returns Str:D
multi method substr(Str:D $s: Int:D $from, Int:D $chars = $s.chars - $from) returns Str:D
```

Returns a part of the string, starting from the character with index `$from`

(where the first character has index 0) and with length `$chars`

.

Examples:

```
substr("Long string", 6, 3); # tri
substr("Long string", 6); # tring
substr("Long string", 6, *-1); # trin
substr("Long string", *-3, *-1); # in
```

## method succ

```
method succ(Str:D) returns Str:D
```

Returns the string incremented by one.

String increment is "magical". It searches for the last alphanumeric sequence that is not preceded by a dot, and increments it.

```
'12.34'.succ # 13.34
'img001.png'.succ # img002.png
```

The actual incrementation step works by mapping the last alphanumeric character to a character range it belongs to, and choosing the next character in that range, carrying to the previous letter on overflow.

```
'aa'.succ # ab
'az'.succ # ba
'109'.succ # 110
'α'.succ # β
'a9'.succ # b0
```

String increment is Unicode-aware, and generally works for scripts where a character can be uniquely classified as belonging to one range of characters.

## method pred

```
method pred(Str:D:) returns Str:D
```

Returns the string decremented by one.

String decrementing is "magical" just like string increment (see succ). It fails on underflow

```
'b0'.pred # a9
'a0'.pred # Failure
'img002.png'.pred # img001.png
```

## routine ord

```
multi sub ord (Str:D) returns Int:D
multi method ord(Str:D:) returns Int:D
```

Returns the codepoint number of the first character of the string

## method ords

```
multi method ords(Str:D:) returns Positional
```

Returns a list of codepoint numbers, one for each character in the string.

## method indent

```
proto method indent($)
multi method indent(Int $steps where { $_ == 0 } )
multi method indent(Int $steps where { $_ > 0 } )
multi method indent($steps where { .isa(Whatever) || .isa(Int) && $_ < 0 )
```

Indents each line of the string by `$steps`

, if `$steps`

is positive, or dedents it by `-$steps`

if `$steps`

is negative. if `$steps`

is `*`

, then the string is dedented to the margin:

```
" indented by 2 spaces\n indented even more".indent(*)
eq "indented by 2 spaces\n indented even more"
```

## method trim

```
method trim(Str:D:) returns Str
```

Remove leading and trailing whitespace. It can be use both as a method on strings and as a function. When used as a method it will return the trimmed string. In order to do in-place trimming, once needs to write `.=trim`

```
my $line = ' hello world ';
say '<' ~ $line.trim ~ '>'; # <hello world>
say '<' ~ trim($line) ~ '>'; # <hello world>
$line.trim;
say '<' ~ $line ~ '>'; # < hello world >
$line.=trim;
say '<' ~ $line ~ '>'; # <hello world>
```

See also trim-trailing and trim-leading

## method trim-trailing

Remove the whitespace characters from the end of a string. See also trim.

## method trim-leading

Remove the whitespace characters from the beginning of a string. See also trim.

## method ACCEPTS

```
multi method ACCEPTS(Str:D: $other)
```

Returns `True`

if the string is the same as `$other`

.

# Type graph

Below you should see a clickable image showing the type relations for Str that links to the documentation pages for the related types. If not, try the PNG version instead.

# Routines supplied by class Cool

Str inherits from class Cool, which provides the following methods:

## routine abs

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

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; # 2
say abs "6+8i"; # 10
```

## method conj

```
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; # 1-2i
```

## routine sqrt

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

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

```
say 4.sqrt; # 2
say sqrt(2); # 1.4142135623731
```

## method sign

```
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; # 1
say (-6).sign; # -1
say "0".sign; # 0
```

## method rand

```
method rand()
```

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

```
say 1e5.rand; # 33128.495184283
```

## routine sin

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

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

```
say sin(0); # 0
say sin(pi/4); # 0.707106781186547
say sin(pi/2); # 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.

## routine asin

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

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

```
say 0.1.asin; # 0.10016742116156
```

## routine cos

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

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

```
say 0.cos; # 1
say pi.cos; # -1
say cos(pi/2); # 6.12323399573677e-17
```

## routine acos

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

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

## routine tan

```
method tan()
sub acos(Numeric(Cool))
```

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

## routine atan

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

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

## routine atan2

```
method atan2($y = 1e0)
sub atan2(Numeric() $x, Numeric() $y = 1e0)
```

Coerces the arguments (including the invocant in the method form) to Numeric, and returns their two-argument arc-tangens in radians.

## method sec

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

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

## routine asec

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

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

## routine cosec

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

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

## routine acosec

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

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

## routine cotan

```
method cotan()
sub cotangens(Numeric(Cool))
```

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

## routine acotan

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

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

## routine sinh

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

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

## routine asinh

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

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

## routine cosh

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

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

## routine acosh

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

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

## routine tanh

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

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

## routine atanh

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

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

## routine log

```
multi method log(Cool:D: Cool:D $base?)
multi sub log(Numeric(Cool) $number, Numeric(Cool) $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.

```
say (e*e).log; # 2
```

## routine log10

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

Coerces the invocant (or in the sub form, the invocant) to Numeric, and returns its Logarithm to base 10, that is, a number that approximatly produces the original number when raised to the power of 10.

```
say log10(1001); # 3.00043407747932
```

## method exp

```
multi method exp(Cool:D: Cool:D $base?)
multi sub exp(Cool:D $pow, 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; # 1
say 1.exp; # 2.71828182845905
say 10.exp; # 22026.4657948067
```

## routine round

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

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; # 2
say 1.07.round(0.1); # 1.1
say 21.round(10); # 20
```

## routine floor

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

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

```
say "1.99".floor; # 1
say "-1.9".floor; # -2
say 0.floor; # 0
```

## routine ceiling

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

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

```
say "1".ceiling; # 1
say "-0.9".ceiling; # 0
say "42.1".ceiling; # 43
```

## routine truncate

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

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

```
say 1.2.truncate # 1
say truncate -1.2; # -1
```

## routine ord

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

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

```
say 'a'.ord; # 65
```

The inverse operation is chr.

Mnemonic: returns an ordinal number

## routine chr

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

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; # A
```

The inverse operation is ord.

Mnemonic: turns an integer into a *char*acter.

## routine chars

```
method chars()
sub chars(Str(Cool))
```

Coerces the invocant (or in sub form, its argument) to Str, and returns the number of characters in the string. Characters should actually be grapheme clusters, though current implementations erroneously count codepoints instead.

```
say 'møp'.chars; # 3
```

## routine codes

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

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

```
say 'møp'.codes; # 3
```

## routine flip

```
method flip()
sub flip(Str(Cool))
```

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

```
say 421.flip; # 124
```

## routine trim

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

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>"; # <abc>
```

## routine trim-leading

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

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>"; # <abc >
```

## routine trim-trailing

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

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-trailing;
say "<$stripped>"; # < abc>
```

## routine lc

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

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

```
say "ABC".lc; # abc
```

## routine uc

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

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

```
say "Abc".uc; # ABC
```

## routine tc

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

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; # AbC
```

## routine tclc

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

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; # Abc
```

## routine wordcase

```
method wordcase(:&filter = &tclc, Mu :$where = True)
sub wordcase(Str(Cool) $input, :&filter = &tclc, Mu :$where = True)
```

Coerces the invocant (or in sub form, the first argument) to Str, and filters each word that smart-matches 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; # Perl 6 Programming
```

With a mather:

```
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
```

## routine chop

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

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

```
say 'perl'.chop; # per
```

## routine chomp

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

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; # 2
say "a\n".chomp.chars; # 1
```

## routine substr

```
method substr($from, $chars?)
sub substr(Str(Cool) $str, $from, $chars?)
```

Coerces the invocant (or in the sub form, the first argument) to Str, and returns the string starting from offset `$from`

. If `$chars`

is supplied, at most `$chars`

characters are returned.

```
say 'zenith'.substr(2); # nith
say 'zenith'.substr(0, 3); # zen
# works on non-strings too:
say 20151224.substr(6); # 24
# sub form:
say substr "zenith", 0, 3; # zen
```

If the `$from`

parameter is a Callable, it is called with the number of chars in the string as argument. This allows easy indexing relative to the end:

```
say 20151224.substr(*-2); # 24
```

## routine ords

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

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

```
say "Perl 6".ords; # 80 101 114 108 32 54
say ords 10; # 49 48
```

This is the list-returning version of ord. The inverse operation in chrs.

## routine chrs

```
method chrs()
sub chrs(*@codepoints) return Str:D
```

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 <80 101 114 108 32 54>.chrs; # Perl 6
```

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

## routine split

```
multi method split( Str:D $delimiter, $limit = Inf, :$all)
multi method split(Regex:D $delimiter, $limit = Inf, :$all)
multi sub split( Str:D $delimiter, Str(Cool) $input, $limit = Inf, :$all)
multi sub split(Regex:D $delimiter, Str(Cool) $input, $limit = Inf, :$all)
```

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.

If the named parameter `:all`

is passed, the matches from `$delimiter`

are included in the result list.

Note that unlike in Perl 5, empty chunks are not removed from the result list. If you want that behavior, consider using comb instead.

```
say split(';', "a;b;c").perl; # ("a", "b", "c").list
say split(';', "a;b;c", :all).perl; # ("a", ";", "b", ";", "c").list
say split(';', "a;b;c", 2).perl; # ("a", "b;c").list
say split(';', "a;b;c", 2, :all).perl; #("a", ";", "b;c").list
say split(';', "a;b;c,d").perl; # ("a", "b", "c,d").list
say split(/\;/, "a;b;c,d").perl; # ("a", "b", "c,d").list
say split(/<[;,]>/, "a;b;c,d").perl; # ("a", "b", "c", "d").list
```

## routine lines

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

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('|'); # a|b
say "some\nmore\nlines".lines.elems; # 3
```

## method words

```
method words(Int() $limit)
```

Coerces the invocant to Str, and returns a list of words that make up the string (and if `$limit`

is supplied, only the first `$limit`

words).

```
say 'The quick brown fox'.words.join('|'); # The|quick|brown|fox
say 'The quick brown fox'.words(2).join('|'); # The|quick
```

Only whitespace counts as word boundaries

```
say "isn't, can't".words.join('|'); # isn't,|can't
```

## routine comb

```
multi method comb(Regex $matcher, $limit = *) returns List:D
multi sub comb(Regex $matcher, Str(Cool) $input, $limit = *) returns List:D
```

Returns all (or if supplied, at most `$limit`

) matches of the invocant (method form) or the second argument (sub form) against the Regex as a list of strings.

```
say "6 or 12".comb(/\d+/).join(", "); # 6, 12
```

## routine index

```
multi sub index(Str(Cool) $s, Str:D $needle, Int(Cool) $startpos = 0) returns Int
multi method index(Str(Cool) $needle, Int(Cool) $startpos = 0) returns Int
```

Coerces the first two arguments (in method form, also counting the invocant) to Str, and searches for `$needle`

in the string 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.

## routine rindex

```
multi sub rindex(Str(Cool) $haystack, Str(Cool) $needle, Int(Cool) $startpos = $haystack.chars)
multi method rindex(Str(Cool) $haystack: Str(Cool) $needle, Int(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.

## routine roots

```
multi method roots(Int(Cool) $n)
multi sub roots(Numeric(Cool) $x, 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 `$n`

th 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);
}
```

produces this output:

```
2+0i 1.22464679914735e-16+2i -2+2.44929359829471e-16i -3.67394039744206e-16-2i
1.77635683940025e-15
4.30267170434156e-15
8.03651692704705e-15
1.04441561648202e-14
```

## method IO

```
method IO() returns IO::Path:D
```

Coerces the invocant to IO::Path.

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

# Routines supplied by class Any

Str inherits from class Any, which provides the following methods:

## method ACCEPTS

```
multi method ACCEPTS(Any:D: Mu $other)
```

Returns `True`

if `$other === self`

(i.e. it checks object identity).

Many built-in types override this for more specific comparisons

## method any

```
method any() returns Junction:D
```

Interprets the invocant as a list and creates an `any`

-Junction from it.

```
say so 2 == <1 2 3>.any; # True
say so 5 == <1 2 3>.any; # False
```

## method all

```
method all() returns Junction:D
```

Interprets the invocant as a list and creates an `all`

-Junction from it.

```
say so 1 < <2 3 4>.all; # True
say so 3 < <2 3 4>.all; # False
```

## method one

```
method one() returns Junction:D
```

Interprets the invocant as a list and creates an `one`

-Junction from it.

```
say so 1 == (1, 2, 3).one; # True
say so 1 == (1, 2, 1).one; # False
```

## method none

```
method none() returns Junction:D
```

Interprets the invocant as a list and creates an `none`

-Junction from it.

```
say so 1 == (1, 2, 3).none; # False
say so 4 == (1, 2, 3).none; # True
```

## method list

Interprets the invocant as a list, and returns that List.

```
say so 42.list.^name; # List
say so 42.list.elems; # 1
```

## method flat

Interprets the invocant as a list, flattens it, and returns that list.

```
say ((1, 2), (3)).elems; # 2
say ((1, 2), (3)).flat.elems; # 3
```

## method eager

Interprets the invocant as a list, evaluates it eagerly, and returns that list.

```
say (1..10).eager; # 1 2 3 4 5 6 7 8 9 10
```

## method elems

Interprets the invocant as a list, and returns the number of elements in the list.

```
say 42.elems; # 1
say <a b c>.elems; # 3
```

## method end

Interprets the invocant as a list, and returns the last index of that list.

```
say 6.end; # 0
say <a b c>.end; # 2
```

## method pairup

```
method pairup() returns List
```

Interprets the invocant as a list, and constructs a list of pairs from it, in the same way that assignment to a Hash does. That is, it takes two consecutive elements and constructs a pair from them, unless the item in the key position already is a pair (in which case the pair is passed is passed through, and the next list item, if any, is considered to be a key again).

```
say (a => 1, 'b', 'c').pairup.perl; # ("a" => 1, "b" => "c").list
```

## sub exit

```
sub exit(Int() $status = 0)
```

Exits the current process with return code `$status`

.

# Routines supplied by class Mu

Str inherits from class Mu, which provides the following methods:

## routine defined

```
multi sub defined(Mu) returns Bool:D
multi method defined() returns Bool:D
```

Returns `False`

on the type object, and `True`

otherwise.

```
say Int.defined; # False
say 42.defined; # True
```

Very few types (like Failure) override `defined`

to return `False`

even for instances:

```
sub fails() { fail 'oh noe' };
say fails().defined; # False
```

## routine Bool

```
multi sub Bool(Mu) returns Bool:D
multi method Bool() returns Bool:D
```

Returns `False`

on the type object, and `True`

otherwise.

Many built-in types override this to be `False`

for empty collections, the empty string or numerical zeros

```
say Mu.Bool; # False
say Mu.new.Bool; # True
say [1, 2, 3].Bool; # True
say [].Bool; # False
say { 'hash' => 'full'}.Bool; # True
say {}.Bool; # False
```

## method Str

```
multi method Str() returns Str
```

Returns a string representation of the invocant, intended to be machine readable. Method `Str`

warns on type objects, and produces the empty string.

```
say Mu.Str; #!> use of uninitialized value of type Mu in string context
```

## routine gist

```
multi sub gist(Mu) returns Str
multi method gist() returns Str
```

Returns a string representation of the invocant, optimized for fast recognition by humans.

The default `gist`

method in `Mu`

re-dispatches to the perl method for defined invocants, and returns the type name in parenthesis for type object invocants. Many built-in classes override the case of instances to something more specific.

`gist`

is the method that say calls implicitly, so `say $something`

and `say $something.gist`

generally produce the same output.

```
say Mu.gist; # (Mu)
say Mu.new.gist; # Mu.new()
```

## routine perl

```
multi sub perl(Mu) returns Str
multi method perl() returns Str
```

Returns a Perlish representation of the object (i.e., can usually be re-evaluated with EVAL to regenerate the object). The exact output of `perl`

is implementation specific, since there are generally many ways to write a Perl expression that produces a particular value

## method clone

```
method clone(*%twiddles)
```

Creates a shallow clone of the invocant. If named arguments are passed to it, their values are used in every place where an attribute name matches the name of a named argument.

```
class Point2D {
has ($.x, $.y);
multi method gist(Point2D:D:) {
"Point($.x, $.y)";
}
}
my $p = Point2D.new(x => 2, y => 3);
say $p; # Point(2, 3)
say $p.clone(y => -5); # Point(2, -5)
```

## method new

```
multi method new(*%attrinit)
```

Default method for constructing (create + initialize) new objects of a class. This method expects only named arguments which are then used to initialize attributes with accessors of the same name.

Classes may provide their own `new`

method to override this default.

`new`

triggers an object construction mechanism that calls submethods named `BUILD`

in each class of an inheritance hierarchy, if they exist. See the documentation on object construction for more information.

## method bless

```
method bless(*%attrinit) returns Mu:D
```

Lower-level object construction method than `new`

.

Creates a new object of the same type as the invocant, uses the named arguments to initialize attributes, and returns the created object.

You can use this method when writing custom constructors:

```
class Point {
has $.x;
has $.y;
multi method new($x, $y) {
self.bless(:$x, :$y);
}
}
my $p = Point.new(-1, 1);
```

(Though each time you write a custom constructor, remember that it makes subclassing harder).

## method CREATE

```
method CREATE() returns Mu:D
```

Allocates a new object of the same type as the invocant, without initializing any attributes.

```
say Mu.CREATE.defined; # True
```

## method print

```
multi method print() returns Bool:D
```

Prints value to `$*OUT`

after stringification using `.Str`

method without adding a newline at end.

```
"abc\n".print; # abc
```

## method say

```
multi method say() returns Bool:D
```

Prints value to `$*OUT`

after stringification using `.gist`

method with newline at end.

```
say 42; # 42
```

## method ACCEPTS

```
multi method ACCEPTS(Mu:U: $other)
```

`ACCEPTS`

is the method that smart matching with the infix ~~ operator and given/when invokes on the right-hand side (the matcher).

The `Mu:U`

multi performs a type check. Returns `True`

if `$other`

conforms to the invocant (which is always a type object or failure).

```
say 42 ~~ Mu; # True
say 42 ~~ Int; # True
say 42 ~~ Str; # False
```

Note that there is no multi for defined invocants; this is to allow autothreading of junctions, which happens as a fallback mechanism when no direct candidate is available to dispatch to.

## method WHICH

```
multi method WHICH() returns ObjAt:D
```

Returns an object of type ObjAt which uniquely identifies the object. Value types override this method which makes sure that two equivalent objects return the same return value from `WHICH`

.

```
say 42.WHICH eq 42.WHICH; # True
```

## method WHERE

```
method WHERE() returns Int
```

Returns an `Int`

representing the memory address of the object.

## method WHY

```
multi method WHY()
```

Returns the attached Pod value. For instance,

```
sub cast(Spell $s)
#= Initiate a specified spell normally
#= (do not use for class 7 spells)
{
do-raw-magic($s);
}
say &cast.WHY;
```

prints

```
Initiate a specified spell normally (do not use for class 7 spells)
```

See the documentation specification for details about attaching Pod to variables, classes, functions, methods, etc.

## trait is export

```
multi sub trait_mod:<is>(Mu:U \type, :$export!)
```

Marks a type as being exported, that is, available to external users.

```
my class SomeClass is export { }
```

A user of a module or class automatically gets all the symbols imported that are marked as `is export`

.