現在のスコープを離れるときに実行されるコードをスケジュールできると便利なことがよくあります。TCLでの私の前の人生で、友人がdeferと呼ばれる関数を作成しました。
次のようなコードが有効になりました。setfp[open"x"] defer( "close $ fp");
これは、現在のスコープが終了したときに呼び出されました。主な利点は、スコープを離れる方法や場所に関係なく、常に呼び出されることです。
だから私はPerlで似たようなものを実装しましたが、もっと簡単な方法があるようです。コメント批評を歓迎します。
私がPerlでそれをした方法:
- 実行するサブの配列を保持するグローバルなタイ変数を作成します。
- 終了時にfnが呼び出されるようにスケジュールするときはいつでも、localを使用して配列を変更します。現在のスコープを離れると、グローバルが関連付けられているため、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";