我试图使用Any.pm模块,我已下载模块并使用以下代码,我正面临错误
" undefined subroutine& main ::在Any.pm第52行"
调用代码:
use lib "/threads-module/Thread-Queue-Any-1.14/lib/";
require "/threads-module/Thread-Queue-Any-1.14/lib/Thread/Queue/Any.pm";
our $wt_to_mt_queue = Thread::Queue::Any->new();
$wt_to_mt_queue->enqueue($reference);
不确定缺少什么?
答案 0 :(得分:4)
我尝试使用cpan Thread::Queue::Any
首先安装Thread::Queue::Any
,然后运行以下脚本来重新创建此错误:
use strict;
use warnings;
use Thread::Queue::Any;
my $reference;
our $wt_to_mt_queue = Thread::Queue::Any->new();
$wt_to_mt_queue->enqueue($reference);
结束时没有任何警告或错误
然后我查看了source of Thread::Queue::Any
,第50-52行是以下内容:
sub enqueue {
return shift->SUPER::enqueue( $FREEZE->( \@_ ) );
} #enqueue
此处调用的唯一子例程是$FREEZE
,它更接近源,由第151行的import
方法初始化(我们可以看到现在的位置)。
所以我决定复制require
的使用,但首先我必须找出Thread::Queue::Any
隐藏的位置:
use Thread::Queue::Any;
use Data::Dump;
dd \%INC;
显然它在"Thread/Queue/Any.pm" => "C:/strawberry/perl/site/lib/Thread/Queue/Any.pm",
中。因此,为了反映您对require
的使用,我这样做:
use strict;
use warnings;
#use Thread::Queue::Any;
require 'C:/strawberry/perl/site/lib/thread/Queue/Any.pm';
my $reference;
our $wt_to_mt_queue = Thread::Queue::Any->new();
$wt_to_mt_queue->enqueue($reference);
这给了我以下输出:
Use of uninitialized value in subroutine entry at C:/strawberry/perl/site/lib/thread/Queue/Any.pm line 51.
Use of uninitialized value in subroutine entry at C:/strawberry/perl/site/lib/thread/Queue/Any.pm line 51.
Can't use string ("") as a subroutine ref while "strict refs" in use at C:/strawberry/perl/site/lib/thread/Queue/Any.pm
line 51.
现在这并没有完全反映您的错误,但我仍然认为您并未真正使用该模块,实际上并非using
模块。
另外还给出了模块存储在系统中的位置,我怀疑你实际上并没有安装它,你应该使用cpan或其中一个等价物。
答案 1 :(得分:0)
如果您将完整路径传递给require,为什么还要设置lib?以下内容比您拥有的要好:
use lib "/threads-module/Thread-Queue-Any-1.14/lib";
require "Thread/Queue/Any.pm";
更好的是:
use lib "/threads-module/Thread-Queue-Any-1.14/lib";
require Thread::Queue::Any;
但你为什么要使用require
???
use lib "/threads-module/Thread-Queue-Any-1.14/lib";
use Thread::Queue::Any qw( );
qw( )
表示您不想从模块导入任何内容。不幸的是,Thread :: Queue :: Any在import
子中具有关键逻辑 - 这是一个糟糕的设计 - 所以必须使用他跟随:
use lib "/threads-module/Thread-Queue-Any-1.14/lib";
use Thread::Queue::Any;
这会导入默认导出 - 其中没有 - 但它最终也会调用T :: Q :: A中错误放置的代码。