【发布时间】:2014-08-15 04:48:00
【问题描述】:
通常,当我在 Perl 中构建数据结构时,我最终不得不将它从 %leaf 声明为 %root,所以我一直在修改一个允许我从
@987654324 构建的模块@到$seed->trunk->branch->leaf。
AUTOLOAD 和new 子例程并不难。我对 SO 的问题是如何检测是否正在使用“严格”编译指示,以便模块以不同的模式运行,这需要在使用前“声明”变量,这样我就不会意外地为$seed->drunk 当我使用 strict 时——假设模块被称为 branch,这是模块使用的有效语法
$seed->declare('trunk');
$seed->trunk(new branch);
$seed->trunk->declare('leaf');
$seed->trunk->leaf("value");
如何检测严格的编译指示是否在模块的调用程序中生效?
这可能是不可能的——在这种情况下,我必须使用静态变量来处理与模块无关的编译指示。
编辑/后记:
我编写了不检查“严格性”或不实现“声明”子例程的初始版本,并意识到如果自动加载器通过引用操作,它不会提供足够简单的用户语法,所以我写它来检查对于第一个参数并将传递的值分配给对象引用的哈希表中的元素,否则如果没有参数,它将返回指定元素的值。
所以我发布分支模块的代码以满足您的好奇心。请注意,我还没有实施严格性检查。
package branch;
sub new
{
my $type = shift;
my $self = { };
bless $self, $type;
return $self;
}
sub DESTROY
{
my $self = shift;
%$self = undef;
}
sub AUTOLOAD
{
my $self = shift;
my $value = shift;
my $sub = $AUTOLOAD;
my ($type, $PROGRAM) = ($sub =~ /(.*)::(.*)/);
if( $value ne undef )
{
$$self{$PROGRAM} = $value;
return $value;
}
return $$self{$PROGRAM};
}
1;
【问题讨论】:
-
检测它是否在哪里生效?限制不是全球性的。
-
您的问题似乎缺少一些重要的上下文,并且使用了术语。您提到声明变量,但
$seed->trunk是一个方法调用。 (显然它返回一个左值,否则您将无法分配给它。)我 认为 1)您将数据结构包装在 OO 接口中,2)您正在使用AUTOLOAD 自动生成访问器,以及 3) 您希望阻止 AUTOLOAD 为尚未预先声明的属性创建访问器。对吗? -
那有什么问题?我描述了我这样做的理由,并且我已经找到了我需要的答案。
-
@JustKevin:我只是想澄清一下。不清楚的问题很难回答,也不太可能对可能遇到类似问题的其他人有用。 (帮助所有人——不仅仅是原始海报——是 SO 的目的。)我还试图弄清楚这是否是 XY problem。
-
@JustKevin 你是个混蛋。尽量不要成为一个家伙。
标签: perl perl-module