In Perl, è possibile avere operazioni su un grilletto variabili la chiamata di codice.
Ad esempio,
use Variable::Magic qw(wizard cast);
my $wiz = wizard(
get => sub { print "get\n" },
set => sub { print "set\n" },
);
cast my $x, $wiz;
$x = 1; print("$x\n");
$x = 2; print("$x\n");
uscite
set
get
1
set
get
2
Tali variabili si dice abbiano magia.
Molte delle variabili in perlvar sono magiche. Ad esempio, $!
utilizza la magia per il proxy errno
e strerror
.
$ perl -E'for (1..5) { $! = $_; say $!; }'
Operation not permitted
No such file or directory
No such process
Interrupted system call
Input/output error
$ perl -MDevel::Peek -e'Dump($!)'
SV = PVMG(0x292fdf0) at 0x28f9648
REFCNT = 1
FLAGS = (GMG,SMG) <--- Has get and set magic
IV = 0
NV = 0
PV = 0
MAGIC = 0x28e0f50
MG_VIRTUAL = &PL_vtbl_sv
MG_TYPE = PERL_MAGIC_sv(\0)
MG_OBJ = 0x28f9660
MG_LEN = 1
MG_PTR = 0x2903230 "!"
Questo è solo uno dei molti usi della magia nel nucleo. Cerca "I tipi attuali di Magic" in perlguts per un numero di altri, incluso lvalue substr
.
# When substr is used as an lvalue, it returns a
# magical variable that changes $s when it's changed.
substr($s, 0, 1) = "abc";
tie
usa la magia per esporre qualcosa di simile alla magia di codice Perl.
Gli hash e gli array magici sono più rari degli scalari magici. %ENV
proxy getenv
e putenv
. @ISA
ha la magia di invalidare le cache di ricerca dei metodi.
$ perl -MDevel::Peek -e'Dump(@ISA, 0);'
SV = PVAV(0x1087e88) at 0x10a3a78
REFCNT = 1
FLAGS = (SMG,RMG) <--- Has set and other magic
MAGIC = 0x108b380
MG_VIRTUAL = &PL_vtbl_isa
MG_TYPE = PERL_MAGIC_isa(I)
MG_OBJ = 0x10a3a90
ARRAY = 0x0
FILL = -1
MAX = -1
ARYLEN = 0x0
FLAGS = (REAL)
L'array '@ _' è" magico ". – serenesat
L'array '@ _' non è magico. – mob