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

以前よりシンボルテーブルに対する理解が深まった気がする

http://www.amazon.co.jp/dp/4873113970/search042-22/ref=nosim/マスタリングPerl