begin/endと名付けられたtypeglobを見た

こういう書き方ができるのを知らなかった。

DBIx/QueryLog.pm#L82-L85

*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