Что такое магический массив в Perl?
В документации Perl для reverse
я нахожу это:
"Обратите внимание, что обращение вспять массива к себе (как в @a = reverse @a) будет когда-нибудь сохранять несуществующие элементы, т.е. для немагических массивов или для связанных массивов с EXISTS и DELETE."
Какие свойства отличает магию от не магического массива?
Ответы
Ответ 1
Магический массив - это тот, где выполняемая операция не просто изменяет содержимое. Единственный встроенный массив с магией - @ISA
, и это очень неочевидно. Как следует из предложения, магический массив в основном связан с массивом, см. tie
и perltie
Ответ 2
Магические переменные - это те, которые имеют специальные функции, которых нет у обычных переменных этого типа.
См. Магические переменные в perlguts. См. Также Variable::Magic, который позволяет вам "Связать определяемую пользователем магию с переменными с Perl".
Ответ 3
В Perl возможно выполнение операций с переменной, вызывающей вызов кода.
Например,
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");
выходы
set
get
1
set
get
2
Такие переменные, как говорят, имеют магию.
Многие из переменных в perlvar являются волшебными. Например, $!
использует magic для прокси errno
и 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 "!"
Это просто одно из многих применений магии в ядре. Найдите "Текущие виды магии" в perlguts для ряда других, включая lvalue substr
.
# When substr is used as an lvalue, it returns a
# magical variable that changes $s when it changed.
substr($s, 0, 1) = "abc";
tie
использует магию, чтобы выставить что-то похожее на магию на Perl-код.
Магические хэши и массивы реже магических скаляров. %ENV
прокси getenv
и putenv
. @ISA
имеет магию для недействительности кэшей поиска методов.
$ 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)