현재 범위를 벗어날 때 코드를 실행하도록 예약하는 것이 유용하다는 것을 자주 발견합니다. TCL에서의 나의 이전 생활에서, 친구는 우리가 지연이라고 부르는 함수를 만들었습니다.Perl에서 범위 변경시 코드 연기
다음과 같은 코드가 활성화되었습니다. set fp [open "x"] defer ("close $ fp");
현재 범위가 종료 될 때 호출되었습니다. 가장 큰 장점은 범위를 벗어나는 방법과 장소에 관계없이 항상 호출된다는 것입니다.
그래서 Perl에서 비슷한 것을 구현했지만 더 쉬운 방법이 될 것 같습니다. 비평은 환영합니다.
방법 펄에서 그것을했다 :
- 이 실행하는 서브 우퍼의 배열을 보유하고 글로벌, 묶여 변수를 만들 수 있습니다.
- 종료 할 때 fn을 호출하도록 예약 할 때마다 로컬을 사용하여 배열을 변경합니다. 현재 범위를 벗어날 때 Perl은 전역이 연결되어 있기 때문에 이전 값인 으로 전역을 변경합니다.이 값 변경이 발생하면 목록에서 하위를 호출 할 수 있습니다.
실제 코드는 다음과 같습니다.
더 좋은 방법이 있나요? 이것은 일반적으로 필요한 기능이라고 보입니다.
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";
좋은 아이디어이지만 더 나은 버전을 만들려고합니다. 그. 구현은 약간 성가신 IMHO입니다. –