begin/endと名付けられたtypeglobを見た
こういう書き方ができるのを知らなかった。
*enable = *begin = \&import; *disable = *end = \&unimport;
- コードリファレンスをbegin enable end disableと名付けたtypeglobへ保存している
- レキシカルスコープでパッケージを有効化、無効化するのにenable/disableを使っていて分かりやすい
ただ、beginとendのtypeglobが分からなくて、もやもやする。
BEGINやENDブロックは分かるけど、ブロックとコードリファレンスは等価なんだっけ??
The Perl Playgroundでいくつか標準モジュールを眺めたけど、そういうシンボルは存在しない。本体の実装読まないと分からないのかもしれない。
use Benchmark; use Carp; use Time::HiRes; use Math::BigInt; foreach my $m (qw{Benchmark Carp Time::HiRes Math::BigInt}) { foreach my $entry (qw{BEGIN END DESTROY begin end import} ) { print $entry . "\n"; print join("\n", map { " $_ -- " . *{$m . "::" . $entry}{$_} } qw{ CODE IO GLOB FORMAT NAME PACKAGE } ) . "\n"; } }
BEGIN CODE -- IO -- GLOB -- GLOB(0x55a7b7367af8) FORMAT -- NAME -- BEGIN PACKAGE -- Benchmark END CODE -- IO -- GLOB -- GLOB(0x55a7b7345740) FORMAT -- NAME -- END PACKAGE -- Benchmark DESTROY CODE -- IO -- GLOB -- GLOB(0x55a7b73458d8) FORMAT -- NAME -- DESTROY PACKAGE -- Benchmark begin CODE -- IO -- GLOB -- GLOB(0x55a7b73671f8) FORMAT -- NAME -- begin PACKAGE -- Benchmark end CODE -- IO -- GLOB -- GLOB(0x55a7b7367210) FORMAT -- NAME -- end PACKAGE -- Benchmark import CODE -- CODE(0x55a7b7437350) IO -- GLOB -- GLOB(0x55a7b7452cc8) FORMAT -- NAME -- import PACKAGE -- Benchmark BEGIN CODE -- IO -- GLOB -- GLOB(0x55a7b73816d0) FORMAT -- NAME -- BEGIN PACKAGE -- Carp END CODE -- IO -- GLOB -- GLOB(0x55a7b73672b8) FORMAT -- NAME -- END PACKAGE -- Carp DESTROY CODE -- IO -- GLOB -- GLOB(0x55a7b7367228) FORMAT -- NAME -- DESTROY PACKAGE -- Carp begin CODE -- IO -- GLOB -- GLOB(0x55a7b73672d0) FORMAT -- NAME -- begin PACKAGE -- Carp end CODE -- IO -- GLOB -- GLOB(0x55a7b7367378) FORMAT -- NAME -- end PACKAGE -- Carp import CODE -- IO -- GLOB -- GLOB(0x55a7b7367ac8) FORMAT -- NAME -- import PACKAGE -- Carp BEGIN CODE -- IO -- GLOB -- GLOB(0x55a7b74375f0) FORMAT -- NAME -- BEGIN PACKAGE -- Time::HiRes END CODE -- IO -- GLOB -- GLOB(0x55a7b7367348) FORMAT -- NAME -- END PACKAGE -- Time::HiRes DESTROY CODE -- IO -- GLOB -- GLOB(0x55a7b7367360) FORMAT -- NAME -- DESTROY PACKAGE -- Time::HiRes begin CODE -- IO -- GLOB -- GLOB(0x55a7b7437200) FORMAT -- NAME -- begin PACKAGE -- Time::HiRes end CODE -- IO -- GLOB -- GLOB(0x55a7b75481a8) FORMAT -- NAME -- end PACKAGE -- Time::HiRes import CODE -- CODE(0x55a7b7452908) IO -- GLOB -- GLOB(0x55a7b7452da0) FORMAT -- NAME -- import PACKAGE -- Time::HiRes BEGIN CODE -- IO -- GLOB -- GLOB(0x55a7b74370b0) FORMAT -- NAME -- BEGIN PACKAGE -- Math::BigInt END CODE -- IO -- GLOB -- GLOB(0x55a7b7367708) FORMAT -- NAME -- END PACKAGE -- Math::BigInt DESTROY CODE -- IO -- GLOB -- GLOB(0x55a7b74f5588) FORMAT -- NAME -- DESTROY PACKAGE -- Math::BigInt begin CODE -- IO -- GLOB -- GLOB(0x55a7b74f5180) FORMAT -- NAME -- begin PACKAGE -- Math::BigInt end CODE -- IO -- GLOB -- GLOB(0x55a7b7408ab8) FORMAT -- NAME -- end PACKAGE -- Math::BigInt import CODE -- CODE(0x55a7b772ba98) IO -- GLOB -- GLOB(0x55a7b77503e0) FORMAT -- NAME -- import PACKAGE -- Math::BigInt