【问题标题】:undefined subroutine &main:: called at Any.pm Issue with Thread::Queue::Any未定义的子例程 &main:: 在 Any.pm 调用 Thread::Queue::Any 问题
【发布时间】:2014-03-26 21:28:59
【问题描述】:

我正在尝试使用 Any.pm 模块,我已经下载了该模块并使用以下代码,我面临错误

"未定义的子程序 &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);

不确定缺少什么?

【问题讨论】:

  • 您使用require 而不是use Thread::Queue::Any; 是否有特殊原因?另外,方法是enqueue,而不是en queue。该空间是随机复制和粘贴工件吗?
  • 我也尝试过使用“use”,但也遇到了同样的问题。这是一个打字错误,我在我的代码中使用了 enqueue
  • our?!?!?!你不应该使用our!使用my

标签: multithreading perl


【解决方案1】:

我尝试通过首先使用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 或等效模块之一的模块。

【讨论】:

  • 它帮助我解决了至少这个错误,但现在我看到了一个全新的错误。 enqueue 中的错误是 Can't store CODE items at blib/lib/Storable.pm (autosplit into blib/lib/auto/Storable/_freeze.al) line 339, at /home/threadsmodule/Thread-Queue-Any-1.14 /lib//线程/队列/Any.pm 第 54 行
  • 我尝试了以下操作:my $ref = sub { print "hello "; }; $wt_to_mt_queue->enqueue($ref); 并得到了同样的错误。然而,这个模块似乎并不打算存储代码引用,只是数据结构。阅读文档。
【解决方案2】:

如果将完整路径传递给 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 中放错位置的代码。

【讨论】:

    猜你喜欢
    • 2011-10-08
    • 1970-01-01
    • 2021-11-18
    • 2021-04-16
    • 1970-01-01
    • 2013-06-25
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多