725 lines
14 KiB
Raku
725 lines
14 KiB
Raku
#!/usr/bin/perl6
|
|
|
|
use v6;
|
|
|
|
if True {
|
|
say "Hello";
|
|
}
|
|
|
|
if True {
|
|
say "Hello"; # Bad indentation intended
|
|
}
|
|
|
|
if True { say "Hello" }
|
|
|
|
if True {say "Hello"}
|
|
|
|
if True { say "Hello" } else { say "Goodbye" }; say "world";
|
|
|
|
## BEGIN Comments
|
|
|
|
say 1 #`( blah TODO blah
|
|
here? ) 2 ;
|
|
say 1 #`{{ blah TODO blah
|
|
here? }} 2 ;
|
|
say 1 #`[[ blah TODO blah ]
|
|
here? ]] 2 ;
|
|
say 1 #`««« blah TODO blah
|
|
here? »»» 2 ;
|
|
say 1 #` ( blah TODO blah
|
|
2 ;
|
|
|
|
#`[
|
|
This is another multi-line comment. ]
|
|
my @sorted = @names.sort({ %sets{$_} }).sort({ %matches{$_} }).reverse;
|
|
#`{ So is this, though it's not actually multi-line. }
|
|
|
|
say 'code again';
|
|
|
|
#`( Multiple line comments `( sub-comment )`)`
|
|
|
|
## END Comments
|
|
|
|
#`[
|
|
And this is how a multi would work.
|
|
That says why we do what we do below.
|
|
]
|
|
|
|
say "No more";
|
|
|
|
#`{{a}a}} say ok
|
|
|
|
say "No more";
|
|
|
|
say "this is code";
|
|
|
|
=begin pod
|
|
|
|
A very simple Pod6 document
|
|
|
|
=end pod
|
|
|
|
=begin head1
|
|
Top Level Heading
|
|
=end head1
|
|
|
|
=head1 Top level heading
|
|
|
|
=for head1
|
|
Top Level Heading
|
|
|
|
=cutsdads
|
|
|
|
=begin pod
|
|
|
|
=head1 This is a head1 title
|
|
|
|
This is a paragraph.
|
|
|
|
=head2 Subsection
|
|
# plop
|
|
Here some text for the subsection.
|
|
|
|
=end pod
|
|
|
|
=begin table :caption<My Tasks>
|
|
mow lawn
|
|
take out trash
|
|
=end table
|
|
|
|
=head1 This is a heading block
|
|
This is an ordinary paragraph.
|
|
Its text will be squeezed and
|
|
short lines filled. It is terminated by
|
|
the first blank line.
|
|
|
|
=head2 This is another heading block
|
|
This is yet another ordinary paragraph,
|
|
at the first virtual column set by the
|
|
previous directive
|
|
|
|
#| Base class for magicians
|
|
class Magician {
|
|
has Int $.level;
|
|
has Str @.spells;
|
|
}
|
|
|
|
#| Fight mechanics
|
|
sub duel(Magician $a, Magician $b) {
|
|
}
|
|
#=«<((
|
|
<Magicians only, no mortals. >
|
|
Magicians only, no mortals.
|
|
))>»
|
|
|
|
say Magician.WHY;
|
|
|
|
#|<< This is an example of stringification:
|
|
* Numbers turn into strings
|
|
> * Regexes operate on said strings
|
|
* C<with> topicalizes and places result into $_
|
|
>>
|
|
sub search-in-seq( Int $end, Int $number ) {
|
|
with (^$end).grep( /^$number/ ) {
|
|
.say for $_<>;
|
|
}
|
|
}
|
|
#= Uses * topic * decont operator
|
|
|
|
|
|
=head1 plop
|
|
abc
|
|
|
|
=head1 plop
|
|
=para
|
|
abc
|
|
|
|
=head1 plop
|
|
abc
|
|
abc
|
|
|
|
=head1 plop
|
|
abc
|
|
|
|
say 1;
|
|
|
|
=head1 plop
|
|
|
|
say 1;
|
|
|
|
=for head1
|
|
plop
|
|
|
|
=for table :conf[str, 'str', "str", 1, True] :conf(str, 'str', "str", 1, True)
|
|
=for table :conf<str 'str' "str" 1 True>
|
|
=for table :conf{k => str, k=>'str', k=>"str", k=>1, k=>True}
|
|
=for table :a :!b :42k :+s
|
|
abc
|
|
|
|
say 2;
|
|
|
|
=begin a
|
|
abc
|
|
=end a
|
|
|
|
=begin b sa
|
|
=end b
|
|
say 2;
|
|
|
|
=begin a
|
|
abc
|
|
|
|
abc
|
|
|
|
abc
|
|
=end a
|
|
say 0 ;
|
|
=begin a:config{42}
|
|
abc
|
|
|
|
=head1 The
|
|
Title
|
|
|
|
abc
|
|
=end ab
|
|
say 1 ;
|
|
|
|
=begin b sa
|
|
=end b
|
|
=begin a
|
|
abc
|
|
=begin b
|
|
abc
|
|
=end b a
|
|
abc
|
|
|
|
abc
|
|
=end a
|
|
say 3 ;
|
|
|
|
=item a
|
|
=item b
|
|
=begin code
|
|
=item a
|
|
=end code
|
|
|
|
=begin code
|
|
=item a
|
|
b
|
|
=end code d
|
|
=end code
|
|
|
|
=begin comment
|
|
Here are several
|
|
lines
|
|
of comment
|
|
=end comment
|
|
|
|
=begin pod
|
|
=head1 acB<<I<a>>>a B<c> U<d> BB<a>
|
|
|
|
C<my $var = 1; say $var;>
|
|
Perl 6 homepage L<https://perl6.org> L<Perl 6 homepage|https://perl6.org>
|
|
Comments L<#Comments> L<Comments|#Comments>
|
|
Perl 6 is awesome Z<Of course it is!>
|
|
Perl 6 is multi-paradigmatic N<Supporting Procedural, Object Oriented, and Functional programming>
|
|
Enter your name K<John Doe> E<0xBB> characters.
|
|
|
|
A X<hash|hashes, definition of; associative arrays>
|
|
|
|
=DISCLAIMER
|
|
P<http://www.MegaGigaTeraPetaCorp.com/std/disclaimer.txt>
|
|
|
|
A X<hash|hashes, definition of; associative arrays>
|
|
is an unordered collection of scalar values indexed by their
|
|
associated string key.
|
|
|
|
my @names = <Foo Bar Baz>;
|
|
my @upper-case-names = @names.map: { .uc } # OUTPUT: [FOO BAR BAZ]
|
|
|
|
=end pod
|
|
|
|
=begin table :caption<My Tasks>
|
|
mow lawn
|
|
take out trash
|
|
=end table
|
|
|
|
=begin table :config{caption => "My Tasks"}
|
|
mow lawn
|
|
take out trash
|
|
=end table
|
|
|
|
|
|
say "\c999 \c999999999 \c[LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER B] \c77s \c[77,22]";
|
|
say "\x0 \x00 \x[0] \x[00] \x[f] \xaaa \xfffffff \xffh \x[ffff] \x[fffffff] \x[42,42]";
|
|
say "\o0 \o00 \o[0] \o[00] \o[7] \o333 \o77777777 \o77h \o[333] \o[77777777] \o[42,42]";
|
|
|
|
say Q[A literal string] ;
|
|
say 「More plainly.」 ;
|
|
say Q ^Almost any non-word character can be a delimiter!^ ;
|
|
say Q 「「Delimiters can be repeated/nested if they are adjacent.」」 ;
|
|
|
|
say Q (this is fine, because of space after Q) ;
|
|
say Q 'and so is this' ;
|
|
say Q<Make sure you <match> opening and closing delimiters> ;
|
|
say Q{This is still a closing curly brace → \} ;
|
|
|
|
say Q;yes, this is fine; ;
|
|
say Q('this is a function') ;
|
|
|
|
say 'Very plain';
|
|
say q[This back\slash stays];
|
|
say q[This back\\slash stays]; # Identical output
|
|
say q{This is not a closing curly brace → \}, but this is → };
|
|
say Q :q $There are no backslashes here, only lots of \$\$\$>!$;
|
|
say '(Just kidding. There\'s no money in that string)';
|
|
say 'No $interpolation {here}!';
|
|
say Q:q!Just a literal "\n" here!;
|
|
say Q:q[a\[]
|
|
say Q[A literal string] ;
|
|
say 「More plainly.」 ;
|
|
say Q ^Almost any non-word character can be a delimiter!^ ;
|
|
say Q 「「Delimiters can be repeated/nested if they are adjacent.」」 ;
|
|
|
|
say qq[My favorite color is {$n+2}!];
|
|
say qq{My favorite color\- is {$n+2}!};
|
|
say Q:qq{My favorite color\- is {$n+2}!};
|
|
say "My $color[0].uc(
|
|
) $n+$n.^name favorite color \q[1is] {$n+2}!abc&uc('a')";
|
|
|
|
say qqww|a|;
|
|
say qq:w:w|a|;
|
|
say q:a:v|a|;
|
|
|
|
say(qq:to/TERM INATOR/, 1+1);
|
|
blah blah
|
|
TERM INATOR
|
|
|
|
|
|
my $don't-do-that = 1;
|
|
my $piece_of_π = 3.14;
|
|
my $駱駝道 = 1;
|
|
my $lexical = 1;
|
|
my $*dynamic1 = 10;
|
|
my $*dynamic2 = 100;
|
|
|
|
sub say-all() {
|
|
say "$lexical, $*dynamic1, $*dynamic2";
|
|
}
|
|
|
|
say-all();
|
|
|
|
{
|
|
my $lexical = 2;
|
|
my $*dynamic1 = 11;
|
|
$*dynamic2 = 101;
|
|
}
|
|
|
|
my $square = 9 ** 2;
|
|
my @array = 1, 2, 3; # Array variable with three elements
|
|
my %hash = London => 'UK', Berlin => 'Germany';
|
|
|
|
class FailHash is Hash {
|
|
has Bool $!final = False;
|
|
multi method AT-KEY ( ::?CLASS:D: Str:D \key ){
|
|
fail X::OutOfRange.new(:what("Hash key"), :got(key),
|
|
:range(self.keys)) if $!final && !self.EXISTS-KEY(key);
|
|
callsame
|
|
}
|
|
|
|
method finalize() {
|
|
$!final = True
|
|
}
|
|
}
|
|
|
|
my %h is FailHash = oranges => "round", bananas => "bendy";
|
|
|
|
say %h<oranges>;
|
|
%h.finalize;
|
|
say %h<cherry>;
|
|
CATCH { default { put .^name, ': ', .Str } }
|
|
|
|
my ( @foo, $bar );
|
|
@foo = ($bar) = 42, "str";
|
|
|
|
say anon class þ {};
|
|
say anon sub þ { 42 };
|
|
|
|
sub a {
|
|
state @x;
|
|
state $l = 'A';
|
|
@x.push($l++);
|
|
};
|
|
|
|
say a for 1..6;
|
|
|
|
sub foo($x) {
|
|
my $v = @;
|
|
$v[$x] = $x;
|
|
say $v;
|
|
}
|
|
|
|
foo($_) for ^3;
|
|
|
|
use MONKEY-TYPING;
|
|
augment class Int {
|
|
method is-answer { self == 42 }
|
|
}
|
|
say 42.is-answer;
|
|
|
|
my $in = 0;
|
|
|
|
sub f(*@c) {
|
|
(temp $in)++;
|
|
"<f>\n"
|
|
~ @c».indent($in).join("\n")
|
|
~ (+@c ?? "\n" !! "")
|
|
~ '</f>'
|
|
};
|
|
|
|
for <ab:c d$e fgh ij*> {
|
|
.say if m/<-alpha>/;
|
|
}
|
|
|
|
for '.' {
|
|
.Str.say when !.IO.d;
|
|
.IO.dir()».&?BLOCK when .IO.d # lets recurse a little!
|
|
}
|
|
|
|
use Dog:auth<Somebody>:ver<2.0>;
|
|
|
|
infix:<+>
|
|
infix:<*>
|
|
infix:«<=»
|
|
|
|
postfix:<²>
|
|
WOW:That'sAwesome
|
|
WOW:That's<<🆒>>
|
|
party:sweet<16>
|
|
|
|
infix:<+>
|
|
infix:<<+>>
|
|
infix:«+»
|
|
infix:['+']
|
|
infix:('+')
|
|
|
|
my $a:b<c>:d<e> = 100;
|
|
my $a:d<e>:b<c> = 200;
|
|
say $a:b<c>:d<e>;
|
|
|
|
use Test; plan 1; constant &term:<👍> = &ok.assuming(True);
|
|
👍
|
|
|
|
my $x = do if True { 42 };
|
|
|
|
say 1000000, 1_000_000, 10_00000, 100_00_00;
|
|
say -2, 12345, 0xBEEF, 0o755, :3<1201>;
|
|
say 1.0, 3.14159, -2.5, :3<21.0012>;
|
|
say 1e0, 6.022e23, 1e-9, -2e48, 2e2i, .42;
|
|
say 2.e2, .2, 0o39, 0xfF3u, 0oi, 0xi, :3<>, :23<gg ; # error
|
|
|
|
|
|
for $size «[r/]« (2**60, 2**50, 2**40, 2**30, 2**20, 2**10)
|
|
Z <EB PB TB GB MB KB> -> [\v,\suffix]
|
|
|
|
my $a = 32;
|
|
$a += 10;
|
|
$a -= 2;
|
|
$a = 3;
|
|
$a min= 5;
|
|
$s ~= 'b';
|
|
|
|
sub infix:<space-concat> ($a, $b) { $a ~ " " ~ $b };
|
|
my $a = 'word1';
|
|
$a space-concat= 'word2';
|
|
|
|
my Real $a = 1/2;
|
|
$a = 3.14;
|
|
$a .= round;
|
|
|
|
my $a = True;
|
|
say so $a != True;
|
|
my $i = 10;
|
|
|
|
my $release = Date.new(:2015year, :12month, :24day);
|
|
my $today = Date.today;
|
|
say so $release !before $today;
|
|
|
|
say 4 R/ 12;
|
|
say [R/] 2, 4, 16;
|
|
say [RZ~] <1 2 3>,<4 5 6>
|
|
|
|
say (1, 2, 3) »*» 2;
|
|
say (1, 2, 3, 4) »~» <a b>;
|
|
say (1, 2, 3) »+« (4, 5, 6);
|
|
say (&sin, &cos, &sqrt)».(0.5);
|
|
|
|
say @a »+=» 1;
|
|
my ($a, $b, $c);
|
|
(($a, $b), $c) «=» ((1, 2), 3);
|
|
|
|
say !« @wisdom;
|
|
@a»++;
|
|
say -« [[1, 2], 3];
|
|
|
|
@slops».?this-method-may-not-exist();
|
|
|
|
my %outer = 1, 2, 3 Z=> <a b c>;
|
|
my %inner = 1, 2 Z=> <x z>;
|
|
say %outer «~» %inner;
|
|
|
|
say $neighbors »>>+<<» ($p, *);
|
|
|
|
sub plus { $^a + $^b };
|
|
say [[&plus]] 1, 2, 3;
|
|
|
|
my @n = [\~] 1..*;
|
|
say @n[^5];
|
|
|
|
@l = <a b c d> Z~ 1, 2, *;
|
|
say so 1 S& 2 S& 3;
|
|
@a X[+=] @b;
|
|
multi sub postfix:<++>($x is rw) is assoc<non>
|
|
say $filename++ for 1..3;
|
|
$x % $y == $x - floor($x / $y) * $y
|
|
say <a a b c a d> ⊍ bag(<a a b c c>);
|
|
say -« <1 2 3>
|
|
|
|
# This is wrong: creates a Hash of Mixes, not Mix:
|
|
my Mix %mix;
|
|
# Works with $ sigil:
|
|
my Mix $mix;
|
|
# Can be typed:
|
|
my Mix[Int] $mix-of-ints;
|
|
|
|
my $x;
|
|
my $x = 7;
|
|
my Int $x = 7;
|
|
my Int:D $x = 7;
|
|
ndef)
|
|
my Int $x where { $_ > 3 } = 7;
|
|
my Int $x where * > 3 = 7;
|
|
|
|
$str ~~ tr:d:c!dol!wne!;
|
|
$str ~~ TR:c/dol/wne/;
|
|
$str ~~ s!foo!fox!;
|
|
$str ~~ /foo/bar/;
|
|
$str ~~ ///;
|
|
$str ~~ rx/foo/bar/;
|
|
$str ~~ Q :regex /foo/;
|
|
$str ~~ s{b(.)r} = " d$0n";
|
|
$str ~~ regex{fox}; # error
|
|
$str ~~ regex {fox};
|
|
rx/ ^ab /;
|
|
/ ^ ab /;
|
|
rx/ \d ** 2/;
|
|
$str ~~ tr:d:c!dol!wne!;
|
|
$str ~~ TR:c/dol/wne/;
|
|
$str ~~ s!foo!fox!;
|
|
$str ~~ rx/foo/;
|
|
$str ~~ regex:ds {fox};
|
|
$str ~~ regex{fox};
|
|
my a = /a/;
|
|
rx/ ^ab /;
|
|
a = / ^ ab 'a' "$a" \d \n\n <:L :Script<Latin>> <:Block('Basic Latin')> /;
|
|
//;
|
|
rx:sigspace.\d+ < :Script +:Block "Basic Latin" + :L> #plop
|
|
'-'.;
|
|
rx/ \d ** 2 <[\d a d]+[\x233..\] " \c[dsds]]>/;
|
|
say $str ~~ m:g/[(<[ACGT]> **: 3) \s*]+ \s+ (<[A..Z a a..z \s]>+)/;
|
|
say '$333' ~~ m/^^ <?[$]> . \d+ /;
|
|
say '/foo/o/bar/' ~~ /\/.**!{1..10}\//;
|
|
rx(a);
|
|
rx (a);
|
|
$str ~~ regex {fox};
|
|
$str ~~ s{b(.)r} = " d$0n";
|
|
if 'abc' ~~ / [a||b] (c) / {
|
|
say ~$0; # OUTPUT: «c»
|
|
}
|
|
if 'abc' ~~ / $<myname> = [ \w+ ] / {
|
|
say ~$<myname> # OUTPUT: «abc»
|
|
}
|
|
say 'abc' ~~ / a <( b )> c/;
|
|
say 'abc' ~~ / <(a <( b )> c)>/;
|
|
say "abc" ~~ /a. | ab { print "win" } /;
|
|
|
|
so 'hello world' ~~ m:Perl5/^hello (world)/; # OUTPUT: «True»
|
|
so 'hello world' ~~ m/^hello (world)/; # OUTPUT: «False»
|
|
so 'hello world' ~~ m/^ 'hello ' ('world')/; # OUTPUT: «True»
|
|
|
|
say "Abra abra CADABRA" ~~ m:exhaustive/:i a \w+ a/;
|
|
|
|
my regex ipv4-octet { \d ** 1..3 <?{ $/.Int <= 255 && $/.Int >= 0 }> }
|
|
my regex ipv4-octet { \d ** 1..3 <?{ True }> }
|
|
say 'abc' ~~ / <?before a> && . /;
|
|
say 'abcdefg' ~~ rx{ abc <[email protected]ending_letters> };
|
|
s:g[\d+ <?before \s* @units>] = 5 * $/;
|
|
|
|
|
|
sub walk(\thing, *@keys) is rw {
|
|
my $current := thing;
|
|
for @keys -> $k {
|
|
if $k ~~ Int {
|
|
$current := $current[$k];
|
|
}
|
|
else {
|
|
$current := $current{$k};
|
|
}
|
|
}
|
|
$current;
|
|
}
|
|
|
|
my %hash;
|
|
walk(%hash, 'some', 'key', 1, 2) = 'autovivified';
|
|
|
|
say %hash.perl;
|
|
|
|
class X::WithoutLineNumber is X::AdHoc {
|
|
multi method gist(X::WithoutLineNumber:D:) {
|
|
$.payload
|
|
}
|
|
}
|
|
die X::WithoutLineNumber.new(payload => "message")
|
|
|
|
{ return; CATCH { default { $*ERR.say: .^name, ': ', .Str } } }
|
|
|
|
multi sub trait_mod:<is>(Routine $r, :$export!)
|
|
|
|
react {
|
|
whenever signal(SIGINT) {
|
|
say "goodbye";
|
|
done
|
|
}
|
|
}
|
|
|
|
signal(SIGINT).tap: { say "bye"; exit }; loop {}
|
|
|
|
method base-repeating(Rational:D: Int:D() $base = 10)
|
|
|
|
multi sub prefix:<-->($x is rw) is assoc<non>
|
|
|
|
|
|
multi MAIN(Bool :$man) {
|
|
run $*EXECUTABLE, '--doc', $*PROGRAM;
|
|
}
|
|
|
|
for $file.lines -> $line {
|
|
next unless $line; # ignore any empty lines
|
|
|
|
my ($pairing, $result) = $line.split(' | ');
|
|
my ($p1, $p2) = $pairing.words;
|
|
my ($r1, $r2) = $result.split(':');
|
|
|
|
%sets{$p1} += $r1;
|
|
%sets{$p2} += $r2;
|
|
|
|
if $r1 > $r2 {
|
|
%matches{$p1}++;
|
|
} else {
|
|
%matches{$p2}++;
|
|
}
|
|
}
|
|
|
|
for @sorted -> $n {
|
|
my $match-noun = %matches{$n} == 1 ?? 'match' !! 'matches';
|
|
my $set-noun = %sets{$n} == 1 ?? 'set' !! 'sets';
|
|
say "$n has won %matches{$n} $match-noun and %sets{$n} $set-noun";
|
|
}
|
|
|
|
say "Math: { 1 + 2 }";
|
|
|
|
my @people = <Luke Matthew Mark>;
|
|
say "The synoptics are: {@people}";
|
|
|
|
say "{%sets}";
|
|
say "we have @flavors[0]";
|
|
say "we have @flavors[]";
|
|
say "we have @flavors.sort()";
|
|
say "we have @flavors.sort.join(', ')";
|
|
|
|
my @valid-players = $file.get.words;
|
|
|
|
for $file.lines -> $line {
|
|
my ($pairing, $result) = $line.split(' | ');
|
|
my ($p1, $p2) = $pairing.split(' ');
|
|
if $p1 ∉ @valid-players {
|
|
say "Warning: '$p1' is not on our list!";
|
|
}
|
|
if $p2 ∉ @valid-players {
|
|
say "Warning: '$p2' is not on our list!";
|
|
}
|
|
}
|
|
|
|
my @array = [ 'x', 'xx', 'xxx', 'o', 'oo', 'X', 'Y', 'Z' ];
|
|
my @array = < x xx xxx o oo X Y Z >;
|
|
|
|
sub plus { $^a + $^b };
|
|
say [[&plus]] 1, 2, 3;
|
|
|
|
say [X~] (1, 2), <a b>;
|
|
|
|
my @n = [\~] 1..*;
|
|
say @n[^5];
|
|
|
|
my @l = <a b c d> Z~ ':' xx *;
|
|
@l = <a b c d> Z~ 1, 2, *;
|
|
|
|
say so 1 S& 2 S& 3;
|
|
|
|
say %color«cherry "$fruit"».raku
|
|
say $a.:<++>;
|
|
|
|
say 2 !(elem) (1, 2, 3);
|
|
|
|
say $_ if /A/ ^ff^ /C/ for @list
|
|
|
|
my @result;
|
|
<people of earth>
|
|
==> map({ .tc })
|
|
==> my @caps; @caps # also could wrap in parentheses instead
|
|
==> grep /<[PE]>/
|
|
==> sort()
|
|
==> @result;
|
|
|
|
my @result
|
|
<== sort()
|
|
<== grep({ /<[PE]>/ })
|
|
<== my @caps # unlike ==>, there's no need for additional statement
|
|
<== map({ .tc })
|
|
<== <people of earth>;
|
|
|
|
False and do { 42.say };
|
|
3, do if 1 { 2 } ;
|
|
if 0 { say "no" } elsif False { say "NO" } else { say "yes" }
|
|
$_ = 1; unless False -> $a { $a.say } ;
|
|
when so $a { say 'a' }
|
|
|
|
for 1..100 {
|
|
when * %% 15 { say 'FizzBuzz' }
|
|
when * %% 3 { say 'Fizz' }
|
|
when * %% 5 { say 'Buzz' }
|
|
default { say $_ }
|
|
}
|
|
|
|
multi sub grab(**@a) { "grab $_".say for @a }
|
|
multi sub grab(\a) {
|
|
a ~~ Iterable and a.VAR !~~ Scalar ?? nextwith(|a) !! nextwith(a,)
|
|
}
|
|
|
|
for '.' {
|
|
.Str.say when !.IO.d;
|
|
.IO.dir()».&?BLOCK when .IO.d # lets recurse a little!
|
|
}
|
|
|
|
say a».(0.5); say a>>.(0.5); a.:<sa> ; a. sa :!False
|
|
func <a b>
|
|
|
|
|
|
if 'abc-abc-abc' ~~ / $<string>=( [ $<part>=[abc] ]* % '-' ) / {
|
|
say ~$<string>; # OUTPUT: «abc-abc-abc»
|
|
say ~$<string><part>; # OUTPUT: «abc abc abc»
|
|
say ~$<string><part>[0]; # OUTPUT: «abc»
|
|
}
|
|
|
|
[«[«[«[+]»]»]»] <1 2 3 4>
|