通常,当我建立在Perl的数据结构,我最终不得不从声明它%leaf来%root,所以我一直有一个模块,让我从建立修修补补
 
$seed来$seed->trunk->branch->leaf.  
使用AUTOLOAD和new子程序并不困难.我对SO的问题是如何检测是否正在使用'strict'编译指示,以便模块以不同的模式运行,这需要在使用之前"声明"变量,因此我不会意外地为$seed->drunk当我使用strict时 - 假设模块被调用branch,这是模块使用的有效语法
$seed->declare('trunk');
$seed->trunk(new branch);
$seed->trunk->declare('leaf');
$seed->trunk->leaf("value");
如何从模块中检测调用程序中的严格编译指示是否有效?
可能这是不可能的 - 在这种情况下,我必须使用静态变量来处理与模块无关的编译指示.
EDITED/POSTSCRIPT:
我编写了初始版本,没有检查'严格'或实现'declare'子程序,并意识到自动加载器不提供足够简单的用户语法,如果它通过引用操作,所以我写它来检查第一个参数并分配传递给对象引用的哈希表中的元素的值,否则如果没有参数,则返回指定元素的值.
所以我发布了分支模块的代码以满足您的好奇心.请注意,我还没有实施严格检查.
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;
那么第一件事就是,严格的是什么?Strict有三个subpragma,有自己的行为和要检查的位.use strict 'refs'不允许你取消引用字符串; use strict 'vars'不允许您以不合格的方式访问全局变量,并use strict 'subs'在少数情况下禁用裸字.use strict等同于所有这三个,但它们中的任何一个都不足以接近您所要求的值得捎带的东西.
所以直接回答你的问题:返回[8]列表中的元素caller($i)返回对$ith级调用者有效的编译提示位.如果您查看,strict.pm您可以看到每个子pragma设置的位,并在调用程序级别检查它们,这对应于实际调用您的方法的代码.
但是,回到我原来的观点,你可能不应该,因为那不是严格的.您应该在对象的构造函数上接受一个选项来决定它们是否应该严格运行,或者如果您真的想要一个词法编译指示而不是跟随您的对象的东西,您应该使用perlpragma中的信息编写自己的选项作为教程.自5.10以来的所有perls都支持任意用户定义的编译指示,使用%^H提示哈希作为[10]调用者信息的元素公开.
| 归档时间: | 
 | 
| 查看次数: | 118 次 | 
| 最近记录: |