#!/usr/bin/env perl use warnings; use strict; our $pack = __PACKAGE__; # $main::pack print "$pack\n"; # prints "main" package Foo; our $pack = __PACKAGE__; # $Foo::pack print "$pack\n"; # prints "Foo" package Bar; our $pack = __PACKAGE__; # $Bar::pack print "$pack\n"; # prints "Bar" yak(); # defined below, prints "yak: Bar" package Foo::Bar; our $pack = __PACKAGE__; # $Foo::Bar::pack print "$pack\n"; # prints "Foo::Bar" sub yak { # Foo::Bar::yak() print "yak: ".__PACKAGE__."\n" } yak(); # prints "yak: Foo::Bar" { package Foo; # now back to package "Foo", nested in a new block our $blah = __PACKAGE__; # $Foo::blah print "$blah\n"; # prints "Foo" print "$Foo::pack\n"; # $Foo::pack is still "Foo" print "$Bar::pack\n"; # and $Bar::pack is still "Bar" # however, "$pack" access the most recent lexical definition print "$pack\n"; # so this is actually $Foo::Bar::pack, "Foo::Bar" # yak(); # but this doesn't work, there is no Foo::yak! { package Bar; # and back in package "Bar" # but we're still in the most recent lexical scope print "$pack\n"; # so this is still $Foo::Bar::pack, "Foo::Bar" print "$blah\n"; # and this is still $Foo::blah, "Foo" sub yak { # Bar::yak() print "yak: ".__PACKAGE__."\n" } yak(); # prints "yak: Bar" } }