2015-05-18 18 views
14

Nella Perl documentation for reverse trovo questo:Che cos'è un array magico in Perl?

"Si noti che invertire una matrice a se stesso (come nel @a = @a inverso) manterrà elementi inesistenti quando possibile, cioè, per matrici non magici o per matrici vincolate con metodi EXISTS e DELETE. "

Quali proprietà differenziano un magico da un array non magico?

+0

L'array '@ _' è" magico ". – serenesat

+6

L'array '@ _' non è magico. – mob

risposta

10

A magico array è uno in cui un'operazione eseguita su di esso non si limita a modificare semplicemente il contenuto. L'unico array integrato che ha la magia è @ISA, e questo è in un modo molto non ovvio. Come dice la frase, una matrice magica è per lo più un allineamento legato, See tie e perltie

+4

Filehandle '* ARGV' è magico, ma' @ ARGV' non lo è. – mob

+0

@ikegami: Grazie. Non ho visto che mob stava ottenendo a – Borodin

+0

'@ -' e' @ + 'troppo. – ikegami

12

Le variabili magiche sono quelle che hanno caratteristiche speciali che non hanno una normale variabile di quel tipo.

Vedere Magic Variables in perlguts. Vedi anche Variable::Magic che ti consente di "Associare la magia definita dall'utente alle variabili da Perl".

3

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)