2011-04-27 19 views
8

Tương tự như cách AUTOLOAD có thể được sử dụng để xác định các chương trình con theo yêu cầu, tôi tự hỏi nếu có cách nào để buộc một stash của gói để tôi có thể chặn quyền truy cập vào các biến trong gói đó.Trong Perl, có cách nào để buộc một stash?

Tôi đã thử hoán vị khác nhau của ý tưởng sau đây, nhưng không ai có vẻ làm việc:

{package Tie::Stash; 
    use Tie::Hash; 
    BEGIN {our @ISA = 'Tie::StdHash'} 
    sub FETCH { 
     print "calling fetch\n"; 
    } 
} 

{package Target} 

BEGIN {tie %Target::, 'Tie::Stash'} 

say $Target::x; 

này chết với Bad symbol for scalar ... trên dòng cuối cùng, mà không bao giờ in "calling fetch". Nếu đường dây say $Target::x; bị xóa, chương trình sẽ chạy và thoát đúng cách. Tôi nghĩ rằng sự thất bại phải làm với stashes là như thế, nhưng không giống như băm, do đó, cơ chế tie tiêu chuẩn không hoạt động đúng (hoặc nó có thể chỉ là stash tra cứu không bao giờ gọi tie ma thuật).

Có ai biết nếu điều này là có thể không? Tinh khiết Perl sẽ là tốt nhất, nhưng các giải pháp XS là ok.

+0

Tính năng này có hoạt động nếu bạn lấy 'tie ...' gọi ra khỏi khối 'BEGIN' không? – mob

+0

Nếu bạn làm tie sau đó, perl đã được và đi tìm kiếm glob giữ $ Target :: x, do đó, không có gì xảy ra. Hãy thử chạy perl -M0 = Terse foo.pl để xem tại sao. – Alex

Trả lời

4

Bạn đang gặp lỗi nội bộ biên dịch ("Biểu tượng không hợp lệ cho vô hướng"), điều này xảy ra trong khi Perl đang cố gắng tìm ra '$ Target :: x' là gì, bạn có thể xác minh bằng cách chạy gỡ lỗi Perl với:

perl -DT foo.pl 
... 
### 14:LEX_NORMAL/XOPERATOR ";\n" 
### Pending identifier '$Target::x' 
Bad symbol for scalar at foo.pl line 14. 

Tôi nghĩ rằng GV cho ':: Mục tiêu' được thay thế bằng một thứ khác khi bạn buộc() nó, để bất cứ điều gì cuối cùng cố gắng lấy hàm băm bên trong của nó không thể. Cho rằng cà vạt() là một chút của một mớ hỗn độn, tôi nghi ngờ những gì bạn đang cố gắng làm sẽ không làm việc, cũng được đề nghị của thành viên này thiết lập (cũ) trao đổi trên p5p:

https://groups.google.com/group/perl.perl5.porters/browse_thread/thread/f93da6bde02a91c0/ba43854e3c59a744?hl=en&ie=UTF-8&q=perl+tie+stash#ba43854e3c59a744

1

Một chút muộn cho câu hỏi, nhưng mặc dù nó không thể sử dụng cà vạt để làm điều này, Variable :: Magic cho phép bạn đính kèm ma thuật vào một stash và do đó đạt được một cái gì đó tương tự.

Các vấn đề liên quan