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