Я был так же растерян, как и Питер, поэтому я написал это:
use strict;
use warnings;
sub describe
{
my ($class) = @_;
# Ensure class variable hash name contains "::"
my $cv = $class . ($class !~ /::/ && "::${class}");
# Convert symbolic ref to "hard" ref
no strict "refs";
$cv = \%$cv;
use strict;
print "$class ($cv): \"", $cv->{description}, "\"\n\n";
}
package Simple;
# "our" creates a variable in the current package
# so "our %Simple" is the same as "%Simple::Simple".
# our %Simple = (description => "Simple's package is " . __PACKAGE__);
# print "\%Simple at ", \ %Simple, "\n";
%Simple::Simple = (description => "Simple's package is " . __PACKAGE__);
print "\%Simple::Simple at ", \ %Simple::Simple, "\n";
main::describe __PACKAGE__;
package More::Complex;
%More::Complex =
(description => "More::Complex's package is " . __PACKAGE__);
print "\%More::Complex at ", \ %More::Complex, "\n";
main::describe __PACKAGE__;
Это показывает, что когда в пакете Simple
выражение our %Simple = ...
фактически означает то же самое, что %Simple::Simple = ...
.
Примеры в perltooc.html скрывают это, потому что они никогда не пытаются ссылаться на %Simple
вне его пакета.Почему вы делаете то, что вы спрашиваете?Потому что в реальном мире вы не дублируете код доступа к переменным класса в каждом пакете, а вместо этого они наследуют его от некоторого суперкласса.Код суперкласса должен знать, что переменная класса для класса Simple
равна %Simple::Simple
, как в моем методе describe
(своего рода).
Эта маленькая скрытая бородавка заставляет меня задуматься, непроще иметь фиксированное имя для переменных класса, таких как %Simple::class_varibles
, %More::Complex::class_variables
, даже если вы не выглядите настолько умно, используя слово «одноименный»: -).