Class::Singleton

Class::Singleton

Class::Singleton
Class::Singleton 的 instance 函数是这样实现的:

sub instance {
my $class = shift;

# get a reference to the _instance variable in the $class package
no strict 'refs';
my $instance = \${ "$class\::_instance" };

defined $$instance
? $$instance
: ($$instance = $class->_new_instance(@_));
}

它的目的是在要创建的对象所属的类的符号表中创建一个 $_instance 的标量,并把 $_instance 的引用赋值给 $instance 标量。

我的疑问是:既然第一次调用 instance 函数的时候 ${"$class::_instance"} 还不存在,那此时又怎么能够得到这个不存在的标量的引用呢?如果 Perl 在解析 "$class::_instance" 的时候会自动创建这个标量(如果当时它还不存在),有谁能告诉我在哪本书或哪篇文档中提到过 Perl 的这个特性吗?

非常感谢。
$class::_instance 的确是.
$class::_instance 的确是perl解析的时候创建的
我想,之所以你有疑问,是因为被 use strict 迷惑了吧,你也许会想,在use strict的情况下 perl 中的变量都需事先声明吧?比如 my $foo 这样。
但实际上,如果你仔细阅读 [url=http://perldoc.perl.org/strict.html]strict[/url] 的文档 strict vars 这节你就会发现其实 perl 中的变量本质上是不用声明就可以动态创建使用的,用上 strict vars 只是为了强制限定变量的作用域,如果你在使用变量的时候显示地指定了变量的所属范围,也是可以的,正如 $class::_instance 这样,$class:: 的前缀就告诉了 perl ,_instance 这个变量是属于 $class 这个包范围内的变量,无需事先再用 my ,our 或者 use vars 声明了.
你可以实验一下:
[quote]
#!/usr/bin/perl
use strict;

print $foo; # 报错: Global symbol "$foo" requires explicit package name at - line 3.
[/quote]

[quote]
#!/usr/bin/perl
use strict;

print $main::foo."\n";

$main::foo = "bar";
print $main::foo."\n";
[/quote]

明白了,非常感谢!