Что такое магический массив в 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)