2015-05-18 15 views
14

Trong Perl documentation for reverse Tôi tìm thấy điều này:Mảng ma thuật trong Perl là gì?

"Lưu ý rằng đảo ngược một mảng với chính nó (như trong @a = ngược @a) sẽ bảo tồn các yếu tố không tồn tại bất cứ khi nào có thể, tức là cho mảng phi huyền diệu hoặc cho mảng gắn với các phương pháp EXISTS và DELETE. "

Thuộc tính nào khác biệt một phép thuật từ một mảng không ma thuật?

+0

Mảng '@ _' là" huyền diệu ". – serenesat

+6

Mảng '@ _' không phải là ma thuật. – mob

Trả lời

10

A ma thuật mảng là nơi một thao tác được thực hiện trên đó không chỉ đơn giản là thay đổi nội dung. Mảng tích hợp duy nhất có phép thuật là @ISA và đó là một cách rất rõ ràng. Như câu ngụ ý, một mảng ma thuật là chủ yếu là một mảng gắn, Xem tieperltie

+4

Filehandle '* ARGV' là ma thuật, nhưng' @ ARGV' thì không. – mob

+0

@ikegami: Cảm ơn. Tôi không thấy những gì mob đã nhận được tại – Borodin

+0

'@ -' và' @ + 'quá. – ikegami

12

Biến huyền diệu là những biến có các tính năng đặc biệt mà một biến bình thường thuộc loại đó không có.

Xem Magic Variables in perlguts. Xem thêm Variable::Magic cho phép bạn "Liên kết ma thuật do người dùng xác định với các biến từ Perl."

3

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 errnostrerror.

$ 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 getenvputenv. @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)