8章 シンボルテーブル
- my $global; our $global; とやると警告が出る.(perl 5.10.0 changes 25179)
- シンボルテーブルはhash のように扱うことができる.(keys, delete などの述語を適用できる)
- 型グロブでエイリアスがかけられる.(無名サブルーチンに名前を付けたり)
$ ./p142.pl "our" variable $global masks earlier declaration in same scope at ./p142.pl line 22.
$ perl -le 'print for (keys %main::)'|head version:: stderr _<mro.c Tie:: utf8:: re:: CORE:: DynaLoader:: $ perl -le 'sub ps {print for (keys %Foo::)};print "before"; ps; delete $Foo::{n}; print "after"; ps;package Foo; $n=1;' before n after $ perl -le '*func = sub {print "aaa"}; func()' aaa # (define func (lambda () (print "aaa"))); みたいなもんか $ perl -mstrict -wle 'package Foo::Bar; $n=1; package main; sub cv {my $p=shift;local $glob=shift;print "glob is [$glob]"; for (qw/SCALAR ARRAY HASH CODE IO GLOB FORMAT NAME PACKAGE/) { print "[$_] is " . *{$p.$glob}{$_} if defined *{$p.$glob}{$_}; } print "value = " . ${$p.$glob} if defined ${$p.$glob} }; print "\$Foo::Bar::n = $n"; my $p = "Foo::Bar::"; cv($p, $_) for (keys %{$p});' $Foo::Bar::n = 1 glob is [n] [SCALAR] is SCALAR(0x8ea2678) [GLOB] is GLOB(0x8ea25f8) [NAME] is n [PACKAGE] is Foo::Bar value = 1
下は上のワンライナに -MO=Deparse オプションを追加したもの
$ perl -MO=Deparse -mstrict -wle 'package Foo::Bar; $n=1; package main; sub cv {my $p=shift;local $glob=shift;print "glob is [$glob]"; for (qw/SCALAR ARRAY HASH CODE IO GLOB FORMAT NAME PACKAGE/) { print "[$_] is " . *{$p.$glob}{$_} if defined *{$p.$glob}{$_}; } print "value = " . ${$p.$glob} if defined ${$p.$glob} }; print "\$Foo::Bar::n = $Foo::Bar::n"; my $p = "Foo::Bar::"; cv($p, $_) for (keys %{$p});' BEGIN { $^W = 1; } BEGIN { $/ = "\n"; $\ = "\n"; } use strict (); package Foo::Bar; $n = 1; package main; sub cv { my $p = shift @_; local $glob = shift @_; print "glob is [$glob]"; foreach $_ ('SCALAR', 'ARRAY', 'HASH', 'CODE', 'IO', 'GLOB', 'FORMAT', 'NAME', 'PACKAGE') { print "[$_] is " . *{$p . $glob;}{$_} if defined *{$p . $glob;}{$_}; } print 'value = ' . ${$p . $glob;} if defined ${$p . $glob;}; } print "\$Foo::Bar::n = $Foo::Bar::n"; my $p = 'Foo::Bar::'; ; cv($p, $_) foreach (keys %{$p;}); -e syntax OK
以前よりシンボルテーブルに対する理解が深まった気がする