2015-05-18 11 views
14

Im Perl documentation for reverse finde ich:Was ist ein magisches Array in Perl?

„Beachten Sie, dass (wie in @a = Reverse @a) sich ein Array Umkehren erhalten inexistent Elemente, wann immer möglich, dh für nicht-magischen Arrays oder für gebundene Arrays mit EXISTS und DELETE-Methoden. "

Welche Eigenschaften unterscheiden ein magisches von einem nicht magischen Array?

+0

Das Array '@ _' ist" magisch ". – serenesat

+6

Das Array '@ _' ist nicht magisch. – mob

Antwort

10

Ein magisches Array ist eines, in dem eine Operation mehr als nur den Inhalt verändert. Das einzige eingebaute Array, das Magie hat, ist @ISA, und das ist in einer sehr naheliegenden Weise. Da der Satz schon sagt, ist eine magische Array meist ein gebunden Array, siehe tie und perltie

+4

Dateihandle '* ARGV' ist magisch, aber' @ ARGV' ist nicht magisch. – mob

+0

@ikegami: Danke. Ich habe nicht gesehen, was der Mob bei – Borodin

+0

'@ -' und' @ + 'auch bekommen hat. – ikegami

12

Magische Variablen sind solche, die spezielle Eigenschaften haben, die eine normale Variablen dieses Typs nicht haben.

Siehe Magic Variables in perlguts. Siehe auch Variable::Magic, mit dem Sie benutzerdefinierten Variablen Variablen aus Perl zuordnen können.

3

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)