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
0.072712