Tôi thường thấy hữu ích khi có thể lên lịch mã được thực hiện khi rời khỏi phạm vi hiện tại. Trong kiếp trước của tôi trong TCL, một người bạn đã tạo ra một hàm mà chúng tôi gọi là trì hoãn.Trì hoãn mã về thay đổi phạm vi trong Perl
Mã kích hoạt như sau: đặt fp [open "x"] trì hoãn ("đóng $ fp");
được gọi khi phạm vi hiện tại đã thoát. Lợi ích chính là nó luôn luôn được gọi cho dù tôi có rời khỏi phạm vi như thế nào.
Vì vậy, tôi đã triển khai một cái gì đó tương tự trong Perl nhưng có vẻ như sẽ có một cách dễ dàng hơn. Bình luận phê bình chào đón.
Con đường tôi đã làm điều đó trong Perl:
- tạo ra một biến gắn toàn cầu nắm giữ một loạt các tàu ngầm được thực hiện.
- bất cứ khi nào tôi muốn lên lịch fn được gọi khi thoát, tôi sử dụng cục bộ để thay đổi mảng. khi tôi rời khỏi phạm vi hiện tại, Perl thay đổi toàn cầu thành giá trị trước đó vì toàn cầu bị ràng buộc, tôi biết khi nào thay đổi giá trị này xảy ra và có thể gọi các người đăng ký trong danh sách.
Mã thực tế bên dưới.
Có cách nào tốt hơn để thực hiện việc này không? Dường như đây sẽ là một khả năng phổ biến cần thiết.
use strict;
package tiescalar;
sub TIESCALAR {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
sub FETCH {
my $self = shift;
return $self->{VAL};
}
sub STORE {
my $self = shift;
my $value = shift;
if (defined($self->{VAL}) && defined($value)) {
foreach my $s (@{$self->{VAL}}) { &$s; }
}
$self->{VAL} = $value;
}
1;
package main;
our $h;
tie($h, 'tiescalar');
$h = [];
printf "1\n";
printf "2\n";
sub main {
printf "3\n";
local $h = [sub{printf "9\n"}];
push(@$h, sub {printf "10\n";});
printf "4\n";
{
local $h = [sub {printf "8\n"; }];
mysub();
printf "7\n";
return;
}
}
sub mysub {
local $h = [sub {printf "6\n"; }];
print "5\n";
}
main();
printf "11\n";
Đó là một ý tưởng hay, nhưng tôi dự định tạo ra một phiên bản tốt hơn cái đó. Việc thực hiện là một chút IMHO cồng kềnh. –