小编Ste*_*e O的帖子

如何在不禁用严格的“引用”的情况下重命名 perl __ANON__ sub?

我在这里找到了在 Perl 中重命名匿名订阅者的解决方案。它涉及临时修改符号表以插入所需的名称。此解决方案使用要替换的硬编码符号表名称。我的问题是我想在运行时动态选择符号表名称。像这样的东西:

   $pkg = 'MyPkg::ModA::';
   $name = 'subname';
   ...
   no strict 'refs';
   local *{"${pkg}__ANON__"} = "$name [anon]";
   strict refs;
Run Code Online (Sandbox Code Playgroud)

使其工作的唯一方法是禁用严格引用。如果它们未被禁用,脚本将失败并显示以下消息:

不能使用字符串 ("MyPkg::ModA::__ANON__") 作为符号引用,而在 /path/to/source/File.pm 行 xx 处使用“严格引用”

请注意,可以使用等效语句

   local ${$pkg}{__ANON__} = "$name [anon]";
Run Code Online (Sandbox Code Playgroud)

带有类似的错误消息:

不能使用字符串 ("MyPkg::ModA::") 作为 HASH 引用,而在 /path/to/source/File.pm 行 xx 处使用“严格引用”

是否可以在不禁用严格引用的情况下做同样的事情?

TMI/DNR:
如果您感兴趣,这里有一个完整的示例。具有讽刺意味的是,我的解决方案使用匿名子重命名给定的匿名子。

ModA.pm

package MyPkg::ModA;

use strict;
use warnings;
use MyPkg::Util;

# Create a new instance.
sub new
{
   my ($type, $class, $self);

   # allow for both ModA::new and $moda->new
   $type = shift; …
Run Code Online (Sandbox Code Playgroud)

perl reference strict anonymous-function symbol-table

5
推荐指数
1
解决办法
105
查看次数