Help language development. Donate to The Perl Foundation
Raku port of Perl's reverse() built-in
use P5reverse;
say reverse "Foo"; # ooF
with "Zippo" {
say reverse(); # oppiZ, may need parens to avoid compilation error
}
say reverse 1,2,3; # (3 2 1)
with 1,2,3 {
say reverse(); # (3 2 1), may need parens to avoid compilation error
}
This module tries to mimic the behaviour of Perl's reverse
built-in as closely as possible in the Raku Programming Language.
reverse LIST
In list context, returns a list value consisting of the elements
of LIST in the opposite order. In scalar context, concatenates the
elements of LIST and returns a string value with all characters in
the opposite order.
print join(", ", reverse "world", "Hello"); # Hello, world
print scalar reverse "dlrow ,", "olleH"; # Hello, world
Used without arguments in scalar context, reverse() reverses $_.
$_ = "dlrow ,olleH";
print reverse; # No output, list context
print scalar reverse; # Hello, world
Note that reversing an array to itself (as in "@a = reverse @a")
will preserve non-existent elements whenever possible; i.e., for
non-magical arrays or for tied arrays with "EXISTS" and "DELETE"
methods.
This operator is also handy for inverting a hash, although there
are some caveats. If a value is duplicated in the original hash,
only one of those can be represented as a key in the inverted
hash. Also, this has to unwind one hash and build a whole new one,
which may take some time on a large hash, such as from a DBM file.
%by_name = reverse %by_address; # Invert the hash
Whereas in Perl the type of context determines how reverse
operates, in this implementation it's the type of parameter that determines the semantics. When given a List
, it will revert the order of the elements. When given something that can coerce to a Str
, it will return a string with the characters reversed in order.
In future language versions of Raku, it will become impossible to access the $_
variable of the caller's scope, because it will not have been marked as a dynamic variable. So please consider changing:
reverse;
to either:
reverse($_);
or, using the subroutine as a method syntax, with the prefix .
shortcut to use that scope's $_
as the invocant:
.&reverse;
Elizabeth Mattijsen [email protected]
If you like this module, or what I’m doing more generally, committing to a small sponsorship would mean a great deal to me!
Source can be located at: https://github.com/lizmat/P5reverse . Comments and Pull Requests are wereverseome.
Copyright 2018, 2019, 2020, 2021, 2023 Elizabeth Mattijsen
Re-imagined from Perl as part of the CPAN Butterfly Plan.
This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.