Trong Perl, nó có thể có hoạt động trên một kích hoạt biến sự kêu gọi của mã.
Ví dụ,
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");
đầu ra
set
get
1
set
get
2
biến như vậy được cho là có ma thuật.
Nhiều biến số trong perlvar là điều kỳ diệu. Ví dụ: $!
sử dụng phép thuật để proxy errno
và 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 "!"
Đây chỉ là một trong nhiều ứng dụng phép thuật trong lõi. Tìm kiếm "Các loại ma thuật hiện tại" trong perlguts cho một số người khác, bao gồm cả 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
sử dụng phép thuật để lộ thứ gì đó tương tự như ma thuật với mã Perl.
băm và mảng huyền diệu hiếm hơn vô hướng huyền diệu. %ENV
proxy getenv
và putenv
. @ISA
có phép thuật để vô hiệu hóa bộ nhớ cache tìm kiếm phương pháp.
$ 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)
Mảng '@ _' là" huyền diệu ". – serenesat
Mảng '@ _' không phải là ma thuật. – mob