undefined子例程& main ::使用Thread :: Queue :: Any在Any.pm问题中调用

时间:2014-03-26 05:39:09

标签: multithreading perl

我试图使用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);

不确定缺少什么?

2 个答案:

答案 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中错误放置的代码。