gpt4 book ai didi

perl - 如何检测模块中的 'strict' pragma?

转载 作者:行者123 更新时间:2023-12-01 09:25:35 24 4
gpt4 key购买 nike

通常当我在 Perl 中构建数据结构时,我最终不得不将它从 %leaf 声明为 %root,所以我一直在修改一个模块将允许我从
$seed$seed->trunk->branch->leaf

AUTOLOADnew 子例程并不难。我对 SO 的问题是如何检测是否正在使用“严格”编译指示,以便模块以不同的模式运行,这需要在使用前“声明”变量,这样我就不会意外地为$seed->drunk 当我使用严格时——假设模块被称为 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;

最佳答案

嗯,第一件事是,严格的什么? Strict 有三个 subpragma,有它们自己的行为和要检查的位。 use strict 'refs'不允许您取消引用字符串; use strict 'vars'不允许您以非限定方式访问全局变量,并且 use strict 'subs'在少数情况之外禁用裸词。 use strict等同于所有三个,但它们中的任何一个似乎都没有真正接近你所要求的值得捎带的东西。

所以直接回答你的问题:元素[8]caller($i) 返回的列表中返回对 $i 有效的编译提示位th 级调用者。如果你偷看strict.pm您可以查看每个 subpragma 设置的位,并在与实际调用您的方法的代码相对应的调用者级别检查它们。

但是,回到我原来的观点,您可能不应该这样做,因为这不是严格的意义所在。您应该在对象的构造函数上接受一个选项来决定它们是否应该严格执行,或者如果您真的想要一个词法编译指示而不是跟随您的对象的东西,您应该编写自己的使用 perlpragma 中的信息作为教程。从 5.10 开始的所有 perls 都支持使用 %^H 的任意用户定义的编译指示。提示作为元素 [10] 公开的哈希值来电者信息。

关于perl - 如何检测模块中的 'strict' pragma?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25321388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com