top

TOP  RSS  Login

Perl/シンボルテーブル

Perl >

シンボルテーブルを見るスクリプト。末尾が::のパッケージは省いてある。

#!/usr/bin/perl

my $pkg = shift || "";
for my $k (grep { !m/::$/ } sort keys %{"${pkg}::"}){
	my $v = ${"${pkg}::"}{$k};
	printf("%-15s : %-20s : %s ", $k, $v, unpack("H*",$k));
	if($k !~ m/::$/){
		print (defined(${"${pkg}::${k}"})         ? '$' : "");
		print (defined(*{"${pkg}::${k}"}{ARRAY})  ? '@' : "");
		print (defined(*{"${pkg}::${k}"}{HASH})   ? '%' : "");
		print (defined(*{"${pkg}::${k}"}{CODE})   ? '&' : "");
	}
	print "\n";
}

実行すると、以下のものがシンボルテーブルに登録されているのが分かる。

               : *main::             : 08 $
               : *main::             : 12 
               : *main::             : 18 $
"               : *main::"             : 22 $
$               : *main::$             : 24 $
+               : *main::+             : 2b @
-               : *main::-             : 2d $@
/               : *main::/             : 2f $
0               : *main::0             : 30 $
@               : *main::@             : 40 $%
ARGV            : *main::ARGV          : 41524756 @
ENV             : *main::ENV           : 454e56 %
INC             : *main::INC           : 494e43 @%
STDERR          : *main::STDERR        : 535444455252 
STDIN           : *main::STDIN         : 535444494e 
STDOUT          : *main::STDOUT        : 5354444f5554 
_               : *main::_             : 5f @
_<perlio.c      : *main::_<perlio.c    : 5f3c7065726c696f2e63 $
_<perlmain.c    : *main::_<perlmain.c  : 5f3c7065726c6d61696e2e63 $
_<universal.c   : *main::_<universal.c : 5f3c756e6976657273616c2e63 $
_<xsutils.c     : *main::_<xsutils.c   : 5f3c78737574696c732e63 $
stderr          : *main::stderr        : 737464657272 
stdin           : *main::stdin         : 737464696e 
stdout          : *main::stdout        : 7374646f7574 

${"\x08"}とか${"\x18"}って何なんだろうと検索しても出て来ない。${"\x08"}はスクリプトの内容によって0と256と変わる。${"\x18"}はperlの実行ファイルの場所らしい。 ${"_<perlio.c"}などなんてなんでシンボルテーブルに存在するんだろうと謎。

ちなみにシンボルテーブルに登録されているパッケージは

print join("\n", sort grep { m/::$/ } keys(%{"::"}));

<none>::
CORE::
DB::
DynaLoader::
IO::
Internals::
PerlIO::
Regexp::
UNIVERSAL::
attributes::
main::
utf8::

展開するスクリプト。

#!/usr/bin/perl

flat("main::");

sub flat
{
	my($pkg,$lv) = @_;
	$lv ||= 0;
	for my $k (sort keys(%{$pkg})){
		next if($k eq $pkg);
		print "  " x $lv . $k. " ";
		if($k !~ m/::$/){
			print (defined(${"${pkg}${k}"})         ? '$' : "");
			print (defined(*{"${pkg}${k}"}{ARRAY})  ? '@' : "");
			print (defined(*{"${pkg}${k}"}{HASH})   ? '%' : "");
			print (defined(*{"${pkg}${k}"}{CODE})   ? '&' : "");
		}
		print "\n";
		if($k =~ m/[^:]::$/){
			flat(${$pkg}{$k},$lv+1);
		}
	}
}

実行すると、

 $
 
 $
" $
$ $
+ @
- $@
/ $
0 $
<none>:: 
@ $%
ARGV @
CORE:: 
  GLOBAL:: 
DATA 
DB:: 
DynaLoader:: 
  boot_DynaLoader &
ENV %
INC @%
IO:: 
  Handle:: 
Internals:: 
  HvREHASH &
  SvREADONLY &
  SvREFCNT &
  hash_seed &
  hv_clear_placeholders &
  rehash_seed &
PerlIO:: 
  Layer:: 
    NoWarnings &
    find &
  get_layers &
Regexp:: 
  DESTROY &
STDERR 
STDIN 
STDOUT 
UNIVERSAL:: 
  VERSION &
  can &
  isa &
_ @
_<perlio.c $
_<perlmain.c $
_<universal.c $
_<xsutils.c $
attributes:: 
  bootstrap &
flat &
stderr 
stdin 
stdout 
utf8:: 
  decode &
  downgrade &
  encode &
  is_utf8 &
  native_to_unicode &
  unicode_to_native &
  upgrade &
  valid &

Last modified:2008/02/02 14:21:01

hN

0.274246