Categories
Posts in this category
- Introduction
- Strings, Arrays, Hashes;
- Types
- Basic Control Structures
- Subroutines and Signatures
- Objects and Classes
- Contexts
- Regexes (also called "rules")
- Junctions
- Comparing and Matching
- Containers and Values
- Where we are now - an update
- Changes to Perl 5 Operators
- Laziness
- Custom Operators
- The MAIN sub
- Twigils
- Enums
- Unicode
- Scoping
- Regexes strike back
- A grammar for (pseudo) XML
- Subset Types
- The State of the implementations
- Quoting and Parsing
- The Reduction Meta Operator
- The Cross Meta Operator
- Exceptions and control exceptions
- Common Perl 6 data processing idioms
- Currying
Tue, 21 Oct 2008
Twigils
Permanent link
NAME
"Perl 5 to 6" Lesson 15 - Twigils
SYNOPSIS
class Foo { has $.bar; has $!baz; } my @stuff = sort { $^b[1] <=> $^a[1]}, [1, 2], [0, 3], [4, 8]; my $block = { say "This is the named 'foo' parameter: $:foo" }; $block(:foo<bar>); say "This is file $?FILE on line $?LINE" say "A CGI script" if %*ENV<DOCUMENT_ROOT>:exists;
DESCRIPTION
Some variables have a second sigil, called twigil. It basically means that the variable isn't "normal", but differs in some way, for example it could be differently scoped.
You've already seen that public and private object attributes have the .
and !
twigil respectively; they are not normal variables, they are tied to self
.
The ^
twigil removes a special case from perl 5. To be able to write
# beware: perl 5 code sort { $a <=> $b } @array
the variables $a
and $b
are special cased by the strict
pragma. In Perl 6, there's a concept named self-declared positional parameter, and these parameters have the ^
twigil. It means that they are positional parameters of the current block, without being listed in a signature. The variables are filled in lexicographic (alphabetic) order:
my $block = { say "$^c $^a $^b" }; $block(1, 2, 3); # 3 1 2
So now you can write
@list = sort { $^b <=> $^a }, @list; # or: @list = sort { $^foo <=> $^bar }, @list;
Without any special cases.
And to keep the symmetry between positional and named arguments, the :
twigil does the same for named parameters, so these lines are roughly equivalent:
my $block = { say $:stuff } my $sub = sub (:$stuff) { say $stuff }
Using both self-declared parameters and a signature will result in an error, as you can only have one of the two.
The ?
twigil stands for variables and constants that are known at compile time, like $?LINE
for the current line number (formerly __LINE__
), and $?DATA
is the file handle to the DATA
section.
Contextual variables can be accessed with the *
twigil, so $*IN
and $*OUT
can be overridden dynamically.
A pseudo twigil is <
, which is used in a construct like $<capture>
, where it is a shorthand for $/<capture>
, which accesses the Match object after a regex match.
MOTIVATION
When you read Perl 5's perlvar
document, you can see that it has far too many variables, most of them global, that affect your program in various ways.
The twigils try to bring some order in these special variables, and at the other hand they remove the need for special cases. In the case of object attributes they shorten self.var
to $.var
(or @.var
or whatever).
So all in all the increased "punctuation noise" actually makes the programs much more consistent and readable.