■2006-05-15
* [Perl] threadsの新機能
スタックサイズを設定できるようになったりと色々機能強化されているCPAN版threadsにkillメソッドが追加されて、個別スレッドに擬似的にシグナルを送れるように。
$thr->kill('STOP'); # $SIG{STOP}ハンドラが呼び出される
ところでThread::Stateでpthread実装のithreadsでもプライオリティを変更できるようにする実験をしていたらエライめにあったので、やっぱり無茶はやめようと思いました。
* [Perl][メモ] 汚れUNIVERSAL
弾さんのwhichをUNIVERSALに入れた理由は?を拝見したのですが、私はfibisさんの感じ方に近いなあ。UNIVERSAL-which reviewsでAdam Kennedyさんのとか。……そうだ、もう「名前空間が汚れた!」と思ったら、とっととおさらばできるようにしておいたらどうかしら?
use Symbol::Glob; sub goodbye { my ($proto, $method) = @_; my $class; if (@_ == 0) { die "use goodbye() with 1 or 2 args"; } $class = ref $proto ? ref($proto) : $proto; if (defined $method and length $method) { my $glob = Symbol::Glob->new({name=>$class.'::'.$method}); $glob->delete('sub'); return; } no strict 'refs'; for my $name (keys %{"$class\::"}) { next if ($name =~ /^[_A-Z]+$/); next if ($name =~ /::$/); my $glob = Symbol::Glob->new({name=>$class.'::'.$name}); $glob->delete('sub'); } }
クラスとメソッド名を渡せば該当のものをシンボルテーブルから削除。メソッド名を渡さなければ既存のシンボルテーブルにあるものを全部削除。うーん、せっかくだからどこからでも呼べるようにして……
use UNIVERSAL::isa; use UNIVERSAL::can; use UNIVERSAL::which; use UNIVERSAL::goodbye; use Foo; my $foo = new Foo; # いらないメソッドよ、さようなら $foo->goodbye('meaningless'); # 汚れたUNIVERSALメソッドよ # さようなら〜 UNIVERSAL->goodbye; $foo->which('hoge'); # Error # isaやcanは再実装してね
実にどうでもいいことですが、Acme::Scripticideにはgood_bye_cruel_world()
というのがあります。