gpt4 book ai didi

perl - 是否可以在不禁用严格的情况下访问符号表?

转载 作者:行者123 更新时间:2023-12-05 00:10:03 25 4
gpt4 key购买 nike

在 Perl 中,以下代码很常见。你甚至可以在 constant.pm 之类的东西中看到它.

my $symtab;
{
no strict 'refs';
$symtab = \%{$pkg . '::'};
}

如果我简单地删除严格,我会得到

Can't use string (main::) as a HASH ref while "strict refs" in use



是否可以在不关闭的情况下执行此操作 strict ?

最佳答案

如果您不需要构造存储名称,Strict 不会阻止访问:

use strict;
use warnings;
$Foo::Bar::baz = 42;
my $symtab = \%Foo::Bar::;
print "${$symtab->{baz}}\n";

您还可以通过 stash 层次结构访问它而不会违反严格(它一直是 globs):
use strict;
use warnings;
$Foo::Bar::baz = 42;
my $main_stash = \%::;
my $Foo_stash = $main_stash->{'Foo::'};
my $FooBar_stash = $Foo_stash->{'Bar::'};
print "${$FooBar_stash->{baz}}\n";

Package::Stash提供了一种访问存储的编程方式。
use strict;
use warnings;
use Package::Stash;
$Foo::Bar::baz = 42;
my $package = 'Foo::Bar';
my $stash = Package::Stash->new($package);
print "${$stash->namespace->{baz}}\n"; # dereferencing the glob to access the scalar slot
print "${$stash->get_symbol('$baz')}\n"; # retrieving the scalar slot of the glob directly

警告清空者:仅仅因为严格的 vars 不阻止存储层次结构访问并不意味着这不是 hacky(并且抵抗编译时优化),并且在大多数情况下,只是关闭严格的 'refs' 并构造符号名称是首选。

关于perl - 是否可以在不禁用严格的情况下访问符号表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58732999/

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