($_, '0+');
Bool()->include($m ? $m->($_) : $_) };
subtype "Enum[A...]", as &Item, where { $_ ~~ ARGS };
subtype "Maybe[A]", as &Item, where { !defined($_) || A->test };
subtype "Undef", as &
eq "Regexp" };
subtype "ScalarRefRef`[A]", as &Ref,
where { ref($_) ~~ ["SCALAR", "REF"] }
awhere { ref($_) ~~ ["SCALAR", "REF"] && A->include($$_) };
subtype "ScalarRef`[A]", as &S
atch[qr/\bkitty\b/i],
message { "Speak is'nt included kitty!" };
}
"Kitty!" ~~ SpeakOfKitty # -> 1
"abc" ~~ SpeakOfKitty # -> ""
SpeakOfKitty->validate("abc", "This") # @-> Speak is'nt i
|/]{1,2}+ (?! [=] )
| \^ (?! [=] )
| ~~ | isa
)
)
)
$PPR::GRAMMAR
}xms;
}
# I
te @pure_statements;
@pure_statements = ();
state $VALIDATE_PURE_GIVEN = qr{
\A given (?<GIVEN> (?<ws_post_kw> $OWS ) \(
(?<JUNC> (?: $OWS (?>
document describes Switch::Right version 0.000006
=head1 SYNOPSIS
use Switch::Right;
given ($value) {
when (undef) { say 'an undefined value' }
w
str(self.orig,$pos++,1);
if $char ~~ /^\s$/ {
self.panic("Whitespace character is not allowed as delimiter"); # "can't happen"
}
elsif $char ~~ /^\w$/ {
self.panic("Alphanu
$text ~= $ch;
$to = $¢.pos;
if $ch ~~ "\n" {
$multiline++;
}
.pos - self.pos);
my ($inside) = $all ~~ m!^...\s*(.*?)\s*.$!;
$¢.obs("Perl 5's $all construct", "a smartmatch like \$! ~~ $inside" );
}
}
token special_var
], [b => 2], [c => 3]);
in scalar context, C< tuples > returns a generator:
tuples(...) ~~ zipwith {\@_} ...
=cut
sub tuples {
unless (wantarray) {
unshift
s by default
=over 4
=item * B<iteration>:
$gen->next # iterates over generator ~~ $gen->get($gen->index++)
$gen->() # same. iterators return () when past the end
$gen->filter(do {my %seen; sub {not $seen{$_}++}})
$gen->deref # tuples($a, $b)->deref ~~ zip($a, $b)
=item * B<combinations>:
$gen->zip($gen2, ...) # takes any number of gener
nonassoc named unary operators
nonassoc < > <= >= lt gt le ge
nonassoc == != <=> eq ne cmp ~~
left &
left | ^
left &&
left || //
nonassoc .. ...
right ?:
right = +
r greater than the right
argument.
X<cmp>
Binary "~~" does a smartmatch between its arguments. Smart matching
is described in the next section.
X<~~>
"lt", "le", "ge", "gt" and "cmp" use the collat
tmatch Operator
First available in Perl 5.10.1 (the 5.10.0 version behaved differently),
binary C<~~> does a "smartmatch" between its arguments. This is mostly
used implicitly in the C<when> constru
@_;
__PACKAGE__->new(name => "Exclude", args => [$type1], test => sub { !$type1->test });
},
"~~" => "include",
"eq" => "equal",
"ne" => "nonequal",
;
Aion::Meta::Util::create_getters(qw/name
ion::Type;
my $Int = Aion::Type->new(name => "Int", test => sub { /^-?\d+$/ });
12 ~~ $Int # => 1
12.1 ~~ $Int # -> ""
my $Char = Aion::Type->new(name => "Char", test => sub { /^.\z/ });
$C
har;
77 ~~ $IntOrChar # => 1
"a" ~~ $IntOrChar # => 1
"ab" ~~ $IntOrChar # -> ""
my $Digit = $Int & $Char;
7 ~~ $Digit # => 1
77 ~~ $Digit # -> ""
"a" ~~ ~$Int; # => 1
5 ~~ ~$Int; #
], [b => 2], [c => 3]);
in scalar context, C< tuples > returns a generator:
tuples(...) ~~ zipwith {\@_} ...
=cut
sub tuples {
unless (wantarray) {
unshift
s by default
=over 4
=item * B<iteration>:
$gen->next # iterates over generator ~~ $gen->get($gen->index++)
$gen->() # same. iterators return () when past the end
$gen->filter(do {my %seen; sub {not $seen{$_}++}})
$gen->deref # tuples($a, $b)->deref ~~ zip($a, $b)
=item * B<combinations>:
$gen->zip($gen2, ...) # takes any number of gener
inhypercube} eq "y" ) or ( $dirfiles{ga} eq "y" ) )
{
if ( ( "begin" ~~ @whatto ) and ( not ( "end" ~~ @whatto ) ) and ( $dowhat{jumpinst} eq "y" ) )
{
$orig = "$mypath
LEVEL 1a: cp -R $orig $target\n\n";
}
}
elsif ( ( "begin" ~~ @whatto ) and ( not ( "end" ~~ @whatto ) ) and ( not ( $dowhat{jumpinst} eq "y" ) ) )
{
$orig =
\n\n";
}
}
if ( ( "transition" ~~ @whatto ) and ( not ( "begin" ~~ @whatto) ) and
( not ( "end" ~~ @whatto) ) and ( $dowhat{jumpinst} eq "y" ) )
{
~~ RangeString
if (UNIVERSAL::isa($second, 'Sidef::Types::Range::RangeString')) {
return $second->contains($first);
}
# String ~~
if (UNIVERSAL::isa($first, 'Sidef::Types::Number::Number')) {
# Number ~~ RangeNumber
if (UNIVERSAL::isa($second, 'Sidef::Types::Range::RangeNumber')) {
if (UNIVERSAL::isa($first, 'Sidef::Types::Range::RangeNumber')) {
# RangeNumber ~~ Number
if (UNIVERSAL::isa($second, 'Sidef::Types::Number::Number')) {
;
foreach my $inst_r ( @instances )
{
my %d = %{ $inst_r };
my $is = $d{is};
unless ( $is ~~ @bagnames )
{
push( @bagnames, $is );
push( @baginst, $inst_r );
}
}
return( @baginst
hash = %{ $_[0] };
my ( @bagnames, %newhash );
foreach my $key ( keys %hash )
{
unless ( $key ~~ @bagnames )
{
push( @bagnames, $key );
$newhash{$key} = $hash{$key};
}
}
return( \%ne
werinstnames;
foreach my $instance ( @fewerinsts )
{
my %d = %{ $instance };
unless ( $d{is} ~~ @fewerinstnames )
{
push( @fewerinstnames, $d{is} );
}
}
#say $tee "FEWERINSTNAMES" . dum
d(NUM) && () ~~ [1..10]' | less -r
unichars 'defined(NUM) && [1..10] ~~ NUM' | less -r
unichars 'defined(NUM) && [1..1] ~~ NUM' | less -r
unichars 'defined(NUM) && ! (NUM() ~~ [0..10])' |
less -r
unichars 'defined(NUM) && ! NUM() ~~ [0..10]' | less -r
unichars 'defined(NUM) && NUM <= 10'
unichars 'defined(NUM) && NUM <= 10' | less
unichars 'defined(NUM) && NUM <= 10' |
less -r
unichars 'defined(NUM) && ! NUM() ~~ [1..10]' | less -r
unichars 'defined(NUM) && NUM() ~~ [1..10]' | less -r
unichars '\d' '\p{common}'
unichars '\d' '\p{Latin}
unichars '
d(NUM) && () ~~ [1..10]' | less -r
unichars 'defined(NUM) && [1..10] ~~ NUM' | less -r
unichars 'defined(NUM) && [1..1] ~~ NUM' | less -r
unichars 'defined(NUM) && ! (NUM() ~~ [0..10])' |
less -r
unichars 'defined(NUM) && ! NUM() ~~ [0..10]' | less -r
unichars 'defined(NUM) && NUM <= 10'
unichars 'defined(NUM) && NUM <= 10' | less
unichars 'defined(NUM) && NUM <= 10' |
less -r
unichars 'defined(NUM) && ! NUM() ~~ [1..10]' | less -r
unichars 'defined(NUM) && NUM() ~~ [1..10]' | less -r
unichars '\d' '\p{common}'
unichars '\d' '\p{Latin}
unichars '
$!text ~~ m{^ <[0..9]> } ?? +$!text
!! $!text.unival.Int
!! Num;
}
method Real {
$!text.defined
?? $!text ~~ m{^ <
return; # Default is False for both
$!text ~~ m:m{^ <[ \x09, \x20 .. \x7E ]>+ $} or
$!is_binary = True;
$!text ~~ m:m{^ <[ \x00 .. \x7F ]>+ $} or
$!i
$!sep ~~ m{<[\r\n]>} and self!fail (1003);
$!quo.defined and $!quo ~~ m{<[\r\n]>} and self!fail (1003);
$!esc.defined and $!esc ~~ m{<[\r\n]>} and self!fail
$resultlist = $data ~~ dpath '/AAA/*/CCC'; # [ ['XXX', 'YYY', 'ZZZ'], [ 'RR1', 'RR2', 'RR3' ] ]
Note that the C<match()> function returns an array but the overloaded
C<~~> operator returns an
ove data structure):
$data ~~ dpath '/AAA/*/CCC'
$data ~~ dpath '/AAA/BBB/CCC/../..' # parents (..)
$data ~~ dpath '//AAA' # anywhere (//)
$data ~~ dpath '//AAA/*'
# anywhere + anystep
$data ~~ dpath '//AAA/*[size == 3]' # filter by arrays/hash size
$data ~~ dpath '//AAA/*[size != 3]' # filter by arrays/hash size
$data ~~ dpath '/"EE/E"/CCC'
hin a C<foreach>
loop or a C<given> block, it executes the statement only if the smartmatch
C<< $_ ~~ I<EXPR> >> is true. If the statement executes, it is followed by
a C<next> from inside a C<foreac
XPR) BLOCK elsif (EXPR) BLOCK ...
unless (EXPR) BLOCK elsif (EXPR) BLOCK ... else BLOCK
given (EXPR) BLOCK
LABEL while (EXPR) BLOCK
LABEL while (EXPR) BLOCK continue BLOCK
LABEL
to use the highly experimental C<given>, that could be
written like this:
use v5.10.1;
given ($var) {
when (/^abc/) { $abc = 1 }
when (/^def/) { $def = 1 }
when (/^xyz/) { $xyz = 1 }
def
rence;
my @int = get_intersection( \@aa, \@bb );
foreach my $el ( @aa )
{
if ( not ( $_ ~~ @int ) )
#if ( not ( any { $_ eq $el } @int ) )
{
push ( @difference, $_ );
}
y = @{ $modality_ref };
my @neighbours;
my %bank;
my @newneighbours;
if ( "flat" ~~ @modality )
{
foreach my $e ( @arra )
{
push ( @newneighbours, $e->[0] );
if ( ( $el->[2] ne "" ) and ( $el->[3] >= $minimumcertain ) )
{
unless ( "bankflat" ~~ @modality )
{
if ( scalar( @{ $nears{$el->[0]}{neighbours} } ) == 0 )
turns true if any one pair of
inflexions matches (case-insensitively).
That is:
noun($word1) ~~ noun($word2)
is just a shorthand for:
lc(noun($word1)->singular) eq lc(noun($wor
is then smartmatched
against the other argument.
That is:
$something_else ~~ noun($word1)
noun($word1) ~~ $something_else
are just slightly shorter (and less order-specific) ways of wri
~~ noun($word2) # (ditto)
noun($word1) =~ $word2 # $word1 matches $word2 exactly
noun($word1) ~~ $word2 # any inflexion of $word1 matches $word2
noun($word1) ~~
in in
subsequent 5.10 releases.
=head3 Changes to type-based dispatch
The smart match operator C<~~> is no longer commutative. The behaviour of
a smart match now depends primarily on the type of its
t like the other code references (even if they
choose to ignore it).
=item *
C<%hash ~~ sub {}> and C<@array ~~ sub {}> now test that the subroutine
returns a true value for each key of the hash (or
are no longer
treated specially when appearing on the left of the C<~~> operator,
but like any vulgar scalar.
=item *
C<undef ~~ %hash> is always false (since C<undef> can't be a key in a
hash). No
ed.
=head2 Smart match changes
=head3 Changes to type-based dispatch
The smart match operator C<~~> is no longer commutative. The behaviour of
a smart match now depends primarily on the type of its
t like the other code references (even if they
choose to ignore it).
=item *
C<%hash ~~ sub {}> and C<@array ~~ sub {}> now test that the subroutine
returns a true value for each key of the hash (or
are no longer
treated specially when appearing on the left of the C<~~> operator,
but like any vulgar scalar.
=item *
C<undef ~~ %hash> is always false (since C<undef> can't be a key in a
hash). No
# Test cases
$file ~~ m[Pod-Simple/t];
my ($in_pod, $has_encoding, @non_ascii);
FILE: while (my $line = <$fh>) {
chomp $line;
if ($line ~~ /^=[a-z]+/) {
if ($in_pod) {
if ($line ~~ /^=encoding (\S+)/) {
$has_encoding = 1;
last FILE;
} elsif ($line ~~ /[^[:ascii:]]/) {
my $enc
"$encoding->{Name}?" : 'unknown!'),
};
}
}
if ($line ~~ /^=cut/) {
$in_pod = 0;
}
}
if (@non_ascii and not $has_encoding) {