【发布时间】:2014-12-02 04:27:13
【问题描述】:
我试图在不实例化对象的情况下从类中调用原型函数。我班的一个例子MyClass:
package MyClass;
use strict;
use warnings;
sub import{
my $class = shift;
my ($caller) = caller();
eval "sub ${caller}::myprot(\&);";
eval "*${caller}::myprot = \&MyClass::myprot;";
}
sub myprot (&) {
my ($f) = @_;
$f->();
}
1;
我想从脚本main.pl调用原型:
use strict;
use warnings;
use MyClass;
myprot {
print "myprot\n";
};
我得到了错误:
Use of uninitialized value in subroutine entry at MyClass.pm line 14.
Use of uninitialized value in subroutine entry at MyClass.pm line 14.
Undefined subroutine &main::myprot called at main.pm line 8.
我不太明白未定义的子例程错误:使用use,调用import,它定义了main.pl 的原型。我也真的不明白未初始化的值错误。
我很乐意得到一些解释。
【问题讨论】:
-
我认为你需要
myprot (sub { print "myprot\n"});并且你还需要从你的 MyClass 包中导出 myprot 来做到这一点 stackoverflow.com/questions/17912400/… -
@KeepCalmAndCarryOn:这不是有效的 Perl - 大概你的意思是使用大括号
{..}而不是括号(..)。不——他希望MyClass声明一个函数myprot,它将一个代码块作为它的唯一参数。但我同意他不应该让它看起来像一个没有sub的子程序定义。 -
我相信您不希望在实时代码中真正使用这个?我的回答解释了为什么它对你不起作用,但你真的不能在实验之外做任何类似的事情。
-
不需要第一次评估;仅在自动加载或稍后将定义子例程时才需要前向声明,但在这里您将立即导出它。但请改用 Exporter
-
您的错误消息来自这样一个事实,即您的 eval 在子例程表填充到调用者之前发生。查看the regarding documentation 并记住,据说
use大致等于BEGIN{require module; module::import(args)}。此外,您的evals 缺少一些反斜杠。
标签: perl class subroutine subroutine-prototypes