Skip to content

Instantly share code, notes, and snippets.

@jhthorsen
Created August 28, 2012 13:22
Show Gist options
  • Save jhthorsen/3497913 to your computer and use it in GitHub Desktop.
Save jhthorsen/3497913 to your computer and use it in GitHub Desktop.
Perl globs
package Foo {
our $bar = 123;
sub bar { 'hello' }
warn join ', ', keys %{ "Foo::" }; # bar
my $gv = ${ "Foo::" }{bar};
my $scalar = *$gv{SCALAR};
my $code = *$gv{CODE};
warn $$scalar; # 123
warn $code->(); # hello
}
{
use Package::Anon;
my $p = Package::Anon->new;
my $gv = $p->install_glob('bar');
warn join ', ', keys %$p; # bar
*$gv = \123;
*$gv = sub { 'hello' };
my $scalar = *$gv{SCALAR};
my $code = *$gv{CODE};
warn $$scalar; # 123
warn $code->(); # hello
}
use strict;
use warnings;
use overload ();
my($s1, $o1);
$s1 = Package::Anon->new('EvilHackery');
{ # this is required to make overload work in older perls < 5.14.2
no strict 'refs';
my $gv = $s1->install_glob('OVERLOAD');
*$gv = { dummy => 1 };
}
# overload fallback => 1;
$s1->add_method('()' => \&overload::nil);
*{ $s1->{'()'} } = \1;
# overload q("") => ...
$s1->add_method('(""' => sub { "yikes!" });
$s1->add_method(some_other_method => sub { 42 });
$o1 = $s1->bless({});
warn $o1->some_other_method;
warn $o1;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment