In Perl ist es möglich, Operationen auf einem variablen Trigger den Aufruf-Code.
Zum Beispiel
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");
Ausgänge
set
get
1
set
get
2
Solche Variablen sind die Magie haben.
Viele der Variablen in perlvar sind magisch. Zum Beispiel verwendet $!
Magie, um errno
und strerror
zu übertragen.
$ 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 "!"
Dies ist nur eine der vielen Anwendungen von Magie im Kern. Suchen Sie nach "Die aktuellen Arten von Magie" in perlguts für eine Reihe von anderen, einschließlich 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
nutzt Magie etwas Ähnliches wie Magie zu Perl-Code zu belichten.
Magische Hashes und Arrays sind seltener als magische Skalare. %ENV
Proxies getenv
und putenv
. @ISA
hat Magie, um Methode Lookup-Caches ungültig zu machen.
$ 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)
Das Array '@ _' ist" magisch ". – serenesat
Das Array '@ _' ist nicht magisch. – mob